Preguntas Frecuentes
- Sobre PyAr (el grupo de Usuarios)
- ¿Quiénes somos?
- ¿Qué hacemos?
- ¿Cómo surgió PyAr?
- ¿Qué pasó con el grupo de Meetup?
- ¿Cómo es la organización interna de PyAr?
- ¿Cómo participar?
- ¿Cómo se organiza una reunión?
- Quiero aprender Python. ¿Dónde consigo material?
- ¿Qué puedo esperar de PyAr en el futuro?
- ¿Qué es un ''sprint''?
- ¿Qué es el ''Hip Bar''?
- ¿Como contribuyo al Wiki?
- ¿Cómo colaboro con ésta lista de preguntas?
- Sobre Python (el Lenguaje)
- Sobre Python (el interprete)
- Usando Bases de Datos
- Preguntas surtidas
1. Sobre PyAr (el grupo de Usuarios)
1.1. ¿Quiénes somos?
Un grupo de entusiastas de Python, que decidió aunar esfuerzos para crear una comunidad local como marco de referencia para la aplicación, difusión y mejora de este lenguaje.
1.2. ¿Qué hacemos?
Organizamos reuniones donde debatimos ideas, mantenemos una ListaDeCorreo a través de la cual nos comunicamos, creamos y mantenemos este portal, el cual pretendemos que tenga contenido útil tanto para los miembros de PyAr como para toda aquella persona que se interese por Python. Hoy estamos abocados a lograr que el grupo se consolide, se sumen miembros, y se establezcan las bases para comenzar a generar aportes mas concretos.
1.3. ¿Cómo surgió PyAr?
Merced a búsquedas en Internet, algunas personas se fueron registrando en el grupo de Python de Buenos Aires de Meetup.
A mediados del 2004, el sitio era gratuito y "ranqueaba" alto en los resultados de los buscadores. El origen de aquel grupo es incierto, algunos creen que algún ocasional interesado lo creó, otros suponen que Meetup creaba estos grupos artificialmente como técnica de posicionamiento en buscadores (SEO). Lo único cierto es que un cambio en su funcionamiento (la aparición del rol de "Manager") ayudó a fomentar la organización y posterior concreción de la primera reunión del grupo en Buenos Aires, en septiembre de 2004.
1.4. ¿Qué pasó con el grupo de Meetup?
El grupo de Meetup no era (estrictamente hablando) nacional, sino de Buenos Aires. Por la estructura que tiene Meetup, los grupos se organizan en base a ciudades, no países. Por otro lado, durante 2005 Meetup volvió a cambiar su funcionamiento y empezó a cobrar por el mantenimiento del grupo. Fue por ese motivo que en aquel entonces se tomó la decisión de dejar de usarlo. PyAr había dejado de girar exclusivamente en torno a las reuniones (que es lo que enfatiza Meetup), y ya tenía nombre, sitio y lista de correo propios.
1.5. ¿Cómo es la organización interna de PyAr?
Hoy, mientras la cantidad de miembros del grupo lo permite, tenemos una organización plana, en la que todos debatimos nuestras ideas e inquietudes, y cada uno trata de aportar en lo que puede.
1.6. ¿Cómo participar?
Suscribiéndote a la ListaDeCorreo, registrándote en el portal, asistiendo a cualquiera de nuetros Eventos, aportando ideas. También tenemos un canal de IRC. El servidor es irc.freenode.net, y el nombre del canal es #pyar. Si querés colaborar aportando contenido al Wiki, o ayudando en su mantenimiento, también es posible. Por favor, leé ContribuyendoAlWiki.
1.7. ¿Cómo se organiza una reunión?
Los pasos a seguir para organizar una reunión están documentados en Eventos/Reuniones/ReleaseProcedure.
1.8. Quiero aprender Python. ¿Dónde consigo material?
En AprendiendoPython, vamos recopilando algunos links y material que los miembros de PyAr fuimos leyendo, y que consideramos que puede serte útil a la hora de empezar a aprender o profundizar tus conocimientos sobre este lenguaje.
1.9. ¿Qué puedo esperar de PyAr en el futuro?
Qué el grupo crezca, se consolide y organice formalmente. Que podamos brindar aportes útiles a la sociedad, tales como una Bolsa de Empleos relacionados con Python. Que podamos asesorar a empresas en la utilización de Python. Que comencemos a organizar eventos y seminarios en universidades, foros y empresas. Que promovamos sprints periódicos en los que podamos desarrollar o mejorar productos de software. Que nos contactemos con otros grupos de usuarios de Latinoamérica, y coordinemos esfuerzos con ellos.
1.10. ¿Qué es un ''sprint''?
Según la Portland Pattern Repository's Wiki:
Desde comienzos de 2002 se han realizado varios eventos denominados 'sprint' alrededor del Lenguaje Python / Zope. Un sprint, bajo esta terminología, es una reunión de programadores interesados en trabajar en un determinado proyecto Open Source, con una duración de 3 a 5 días. Los sprints generalmente tienen una audiencia multinacional.
Normalmente una conferencia es precedida por un sprint (tanto es así que ahora cualquier conferencia respetable de Python es precedida por un sprint), pero los sprints también se dan por si solos. Uno o mas 'coaches' guían el proceso. Se dice que los sprints están inspirados por un concepto de XP (eXtreme Programming -- Programación Extrema).
Probablemente los sprints de PyAr no duren 3 a 5 días, al menos al principio... ni contamos con tener una audiencia multinacional. Pero pensamos divertirnos, aprender, y hacer algo útil.
1.11. ¿Qué es el ''Hip Bar''?
El Hip Bar es el pub donde organizamos la mayoría de los encuentros en Capital Federal. Durante mucho tiempo, estuvimos creídos que el lugar se llamaba Hip Hop... si encontrás en el portal o en la lista referencias a ese lugar, tené en cuenta que se trata del mismo pub. Para mayor información (dirección, fotos), tenemos una página dedicada al HipBar.
1.12. ¿Como contribuyo al Wiki?
En la sección ContribuyendoAlWiki vas a encontrar todo (todo se refiere a dos cositas nomás) lo que necesitás para poder empezar a contribuir al wiki.
1.13. ¿Cómo colaboro con ésta lista de preguntas?
Hay otras preguntas todavía sin respuesta, similares a éstas, que son sobre temas que tratamos varias veces en la lista de correo, pero aun a nadie las pasó acá. Si estás interesado y tenés usuario en el wiki, adelante. Sinó, fijate como en la pregunta anterior.
2. Sobre Python (el Lenguaje)
2.1. ¿Cuales son las ventajas/desventajas de usar listas o tuplas? Y diccionarios?
La velocidad de las tuplas vs las listas, se discutió acá hace unos meses: http://grulic.org.ar/lurker/message/20051219.201756.60530154.en.html
Las ventajas o desventajas de usar una u otra dependen del uso que le vaya a dar. Al ser inmutables, las tuplas pueden usarse como índices para diccionarios, las listas no. Las tuplas tienen que recostruirse cada vez que necesitás "modificarlas", las listas no.
Con respecto a si hay realmente diferencia en cuanto a velocidad y tamaño en memoria, las listas y las tuplas deberían ser más rápidas de recorrer, mientras que los diccionarios fueron hechos para acceder rápidamente a ítems particulares.
Mas info en FAQ General de Python
3. Sobre Python (el interprete)
3.1. ¿Cuales son los interpretes que puedo usar?
Las opciones disponibles son:
La consola interactiva por defecto de python (viene con la instalacion, solo hay que escribir python)
3.2. ¿Como puedo configurar mi interprete para que sea mas amigable?
Si estas usando el interprete interactivo por defecto de python, se recomienda leer los siguientes articulos:
AutocomplecionEnConsolaInteractiva: Explica como agregar autocomplecion de metodos y atributos con tab en la consola interactiva
GuardarHistorialEnConsolaInteractiva: Explica como guardar el historial de comandos entre sesiones en la consola interactiva.
4. Usando Bases de Datos
4.1. ¿Cómo me conecto a una base de datos con MySQL?
Este es un ejemplo basico de como hacerlo con MySQL:
>>> import MySQLdb >>> db = MySQLdb.connect(host="localhost", user="root", ... passwd="mypassword", db="PythonU")
Una vez establecida la conexion, hay que crear un "cursor". Un cursor es una estructura de control que se usa para recorrer (y eventualmente procesar) los records de un result set.
El metodo para crear el cursor se llama, originalmente, cursor():
>>> cursor = db.cursor()
Ya tenemos la conexion establecida y el cursor creado, es hora de ejecutar algunos comandos SQL:
>>> cursor.execute("SELECT * FROM Students")
5L
El metodo execute se usa para ejecutar comandos SQL. Note que no hace falta agregar el ';' (punto y coma) al final del comando. Ahora es cuestion de recorrer el objeto cursor.
Para obtener un solo elemento, usamos fetchone():
>>> cursor.fetchone() (1L, 'Joe', 'Campbell', datetime.date(2006, 2, 10), 'N') >>> cursor.fetchall() ((1L, 'Joe', 'Campbell', datetime.date(2006, 2, 10), 'N'), (2L, 'Joe', 'Doe', datetime.date(2004, 2, 16), 'N'), (3L, 'Rick', 'Hunter', datetime.date(2005, 3, 20), 'N'), (4L, 'Laura', 'Ingalls', datetime.date(2001, 3, 15), 'Y'), (5L, 'Virginia', 'Gonzalez', datetime.date(2003, 4, 2), 'N'))
Cual metodo usar dependera de la cantidad de datos que tengamos, la memoria disponible en la PC y sobre todo, de como querramos hacerlo. Si estamos trabajando con datasets limitados, no habra problema con el uso de fetchall(), pero si la base de datos es lo suficientemente grande como para entrar en memoria, se podria implementar una estrategia como la que se encuentra aca:
import MySQLdb
db = MySQLdb.connect(host="localhost", user="root",passwd="secret", db="PythonU")
cursor = db.cursor()
recs=cursor.execute("SELECT * FROM Students")
for x in range(recs):
print cursor.fetchone()
O directamente:
import MySQLdb
db = MySQLdb.connect(host="localhost", user="root",passwd="secret", db="PythonU")
cursor = db.cursor()
cursor.execute("SELECT * FROM Students")
for row in cursor:
print row
(Sebastian Bassi)
4.2. ¿Cómo me conecto a una base de datos con PostgreSQL?
Otro ejemplo basico de como hacerlo con PostgreSQL (similar al de MySQL). Se usó el esquema: CREATE TABLE estudiante ( nombre varchar, apellido varchar, fecha date, booleano bool, legajo serial PRIMARY KEY); Antes que nada se debe instalar el conector (para unix y windows).
Primero importar el conector y crear la conexión a la base de datos:
>>> import psycopg2, psycopg2.extras >>> conn = psycopg2.connect(database='test',user='postgres',password='pass', host='localhost')
Luego crear un cursor para obtener los datos y ejecutar consulta:
>>> cur = conn.cursor()
>>> cur.execute("SELECT * FROM estudiante")
>>> rows=cur.fetchall()
>>> print rows
[['Joe', 'Capbell', datetime.date(2006, 2, 10), False, 1], ['Joe', 'Doe', datetime.date(2004, 2, 16), False, 2], ['Rick', 'Hunter', datetime.date(2005, 3, 20), False, 3], ['Laura', 'Ingalls', datetime.date(2001, 3, 15), True, 4], ['Virginia', 'Gonzalez', datetime.date(2003, 4, 2), False, 5]]
Algo más pitónico es crear el cursor simil diccionario (en vez de una lista de valores):
>>> cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
>>> cur.execute("SELECT * FROM estudiante")
>>> for row in cur: # itero sober cada fila
>>> # row es un diccionario, con las claves = nombres de campos
>>> print "Nombre y Apellido: %s, %s " % (row['nombre'],row['apellido'])
Nombre y Apellido: Joe, Capbell
Nombre y Apellido: Joe, Doe
Nombre y Apellido: Rick, Hunter
Nombre y Apellido: Laura, Ingalls
Nombre y Apellido: Virginia, Gonzalez
Nota: esto es propio del conector psycopg2. Igualmente otros conectores tambien lo soportan o se puede imitar (leyendo el atributo description del cursor que tiene la información de los campos):
>>> print cur.description
(('nombre', 1043, 8, -1, None, None, None), ('apellido', 1043, 8, -1, None, None, None), ('fecha', 1082, 10, 4, None, None, None), ('booleano', 16, 1, 1, None, None, None), ('legajo', 23, 1, 4, None, None, None))
4.3. ¿Cómo escapo las comillas al armar un Query?
Pregunta:
Hola chicos. Estoy con un inconveniente que no puedo solventar. Tengo una funcion de python que genera unos querystrings para postgres.
Mi problema empieza cuando, por ejemplo hay uno de esos apellidos que tienen ', Ej: D'agostino
como resultado me queda el string (ejemplo)
'insert into personas (apellido) values ("D'agostino")'
Respuesta:
Lo que tendrías que hacer es que postgres te escapee automaticamente los valores, usando los parámetros de db-api (segúndo argumento del metodo execute del cursor):
cur = conn.cursor()
cur.execute("insert into personas (apellido) values (%s)" , ["D'agostino"])
Así, automáticamente postgres sabe, según el tipo de datos del parámetro, en este caso un string = "D'agostino", como escapear y formatear el sql para que no de error.
Ademas, esto es mas seguro frente a ataques por "inyección de sql", porque el formateo es automático, en vez de usar directamente el operador % sobre el query y pasarselo cocinado a la base.
Para hacerlo más robusto, podrías usar diccionario con los parametros (es más seguro en el caso que tengas varios parámetros, para evitar errores):
cur.execute("insert into personas (apellido) values (%(apellido)s)" , {"apellido":"D'agostino"})
Gracias Mariano Reingart por la respuesta!
5. Preguntas surtidas
5.1. ¿Hay alguna forma de saber la ruta (path) del archivo actual?
MarianoGuerra preguntó esto en este hilo: http://mx.grulic.org.ar/lurker/thread/20080719.055432.4df0ac40.es.html Esencialmente, el problema es saber la ruta absoluta del script python que se está ejecutando
La respuesta que le dio MartinBothiry es hacer:
os.path.abspath(os.path.dirname(__file__))
