Web2py - El Lenguaje Python
Web2py - El Lenguaje Python
Web2py - El Lenguaje Python
web2py
FullStackWebFramework,4thEd.writtenbyMassimoDiPierroMartin
MuloneJenniferMaldonadoinSpanish(Translationinprogress)
buyprinted pdf
Search
TableofContents
00Prlogo
01Introduccin
02EllenguajePython
03Resumen
04Elncleo
05Lasvistas
06Lacapadeabstraccindelabasededatos
07Formulariosyvalidadores
08CorreoySMS
09Controldeacceso
10Servicios
11jQueryyAjax
12Componentesyagregados
13Recetasdeimplementacin
14Otrasrecetas
15Notasdetraduccin
Chapter2:EllenguajePython
EllenguajePython
AcercadePython
Comenzando
help,dir
Tipos
str
list
tuple
Share
dict
Acercadelespaciado
for...in
while
if...elif...else
try...except...else...finally
def...return
lambda
class
Atributosespeciales,mtodosyoperadores
Entrada/salidadearchivos
exec,eval
import
os
sys
datetime
time
cPickle
EllenguajePython
AcercadePython
Python es un lenguaje de programacin multipropsito de alto nivel Su filosofa de diseo enfatiza la
productividad del programador y la legibilidad del cdigo. Tiene un ncleo sintctico minimalista con
unos pocos comandos bsicos y simple semntica, pero adems tiene una enorme y variada librera
estndar, que incluye una Interfaz de Programacin de Aplicaciones (API) API para muchas de las
funcionesenelniveldelsistemaoperativo(OS).ElcdigoPython,aunqueminimalista,defineobjetos
incorporadoscomolistasenlazadas( list ),tuplas( tuple ),tablashash( dict ),yenterosdelongitud
arbitraria( long ).
Python soporta mltiples paradigmas de programacin, incluyendo programacin orientada a objetos
( class ), programacin imperativa ( def ) y funcional ( lambda ). Python tiene un sistema de tipado
dinmico y manejo automatizado de memoria utilizando conteo de referencias (similar a Perl, Ruby y
Scheme).
Python fue publicado por primera vez por Guido Van Rossum en 1991. El lenguaje tiene un modelo
abierto de desarrollo basado en la comunidad administrado por la organizacin sin fines de lucro
Python Software Foundation. Existen varios intrpretes y compiladores que implementan el lenguaje
Python, incluyendo uno en Java (Jython) pero, en esta corta revisin, vamos a centrarnos en la
implementacinenCcreadaporGuido.
Puedesencontrarvariostutoriales,ladocumentacinoficialylareferenciadelaslibrerasdellenguaje
enelsitioweboficialdePython.[python]
ParareferenciaadicionalsobrePython,podemosrecomendarloslibrosenref.[guido]yref.[lutz].
PuedessaltarteestecaptulosiyatienesexperienciaconellenguajePython.
Comenzando
Lasdistribucionesbinariasdeweb2pyparaMicrosoftWindowsoAppleOSXvienenempaquetadascon
elintrpretedePythonincorporadoenelmismoarchivodeladistribucin.
PuedesiniciarloenWindowsconelsiguientecomando(escribeenprompt/consoladelDOS):
1 web2py.exeSwelcome
SobreAppleOSX,ingresaelsiguientecomandoenunaventanadeterminal(suponiendoqueestsen
lamismacarpetaqueweb2py.app):
1 ./web2py.app/Contents/MacOS/web2pySwelcome
En una mquina con Linux u otro Unix, probablemente ya tengas instalado Python. Si es as, en el
promptdelashellescribe:
1 pythonweb2py.pySwelcome
SinotienesPython2.5(olasposteriores2.x)preinstalado,tendrsquedescargarloeinstalarloantes
decorrerweb2py.
Laopcin Swelcome delneadecomandosordenaaweb2pyqueejecutelashellinteractivacomosi
loscomandosseejecutaranenuncontroladorparalaaplicacinwelcome,laaplicacindeandamiaje
deweb2py.Estoponeatudisposicincasitodaslasclases,objetosyfuncionesdeweb2py.Estaesla
nica diferencia entre la lnea de comando interactiva de web2py y la lnea de comando normal de
Python.
La interfaz administrativa adems provee de una shell basada en web para cada aplicacin. Puedes
accederaladelaaplicacin"welcome"en:
1 http://127.0.0.1:8000/admin/shell/index/welcome
Puedesseguirtodoslosejemplosenestecaptuloutilizandounashellnormalolashellparaweb.
help,dir
EllenguajePythonproveededoscomandosparaobtenerdocumentacinsobreobjetosdefinidosenel
scopeactual,tantolosincorporadoscomolosdefinidosporelusuario.
Podemospedirayuda( help )acercadeunobjeto,porejemplo"1":
1 >>>help(1)
2 Helponintobject:
3
4 classint(object)
5 |int(x[,base])>integer
6 |
7 |Convertastringornumbertoaninteger,ifpossible.Afloatingpoint
8 |argumentwillbetruncatedtowardszero(thisdoesnotincludeastring
9 |representationofafloatingpointnumber!)Whenconvertingastring,use
10 |theoptionalbase.Itisanerrortosupplyabasewhenconvertinga
11 |nonstring.Iftheargumentisoutsidetheintegerrangealongobject
12 |willbereturnedinstead.
13 |
14 |Methodsdefinedhere:
15 |
16 |__abs__(...)
17 |x.__abs__()<==>abs(x)
18 ...
1 >>>dir(1)
2 ['__abs__',...,'__xor__']
Tipos
Pythonesunlenguajedetipadodinmico,oseaquelasvariablesnotienenuntipoyporlotantono
debenserdeclaradas.Losvalores,sinembargo,tienentipo.Puedesconsultaraunavariableeltipode
valorquecontiene:
1 >>>a=3
2 >>>printtype(a)
3 <type'int'>
4 >>>a=3.14
5 >>>printtype(a)
6 <type'float'>
7 >>>a='holaPython'
8 >>>printtype(a)
9 <type'str'>
Pythonademsincluye,comocaractersticasnativas,estructurasdedatoscomolistasydiccionarios.
str
Python soporta el uso de dos diversos tipo de cadenas: ASCII y Unicode. Las cadenas ASCII se
delimitanpor'...',"..."opor'...'o"""...""".Lascomillastriplesdelimitancadenasmultilnea.Lascadenas
Unicode comienzan con un u seguido por la cadena conteniendo caracteres Unicode. Una cadena
UnicodepuedeconvertirseenunacadenaASCIIseleccionandoununacodificacinporejemplo:
1 >>>a='estaesunacadenaASCII'
2 >>>b=u'estaesunacadenaUnicode'
3 >>>a=b.encode('utf8')
Al ejecutar estos tres comandos, la a resultante es una cadena ASCII que almacena caracteres
codificadosconUTF8.Pordiseo,web2pyutilizacadenascodificadasconUTF8internamente.
Ademsesposibleutilizarvariablesencadenasdedistintasformas:
1 >>>print'elnmeroes'+str(3)
2 elnmeroes3
3 >>>print'elnmeroes%s'%(3)
4 elnmeroes3
5 >>>print'elnmeroes%(numero)s'%dict(numero=3)
6 elnmeroes3
Laltimanotacinesmsexplcitaymenospropensaaerrores,yeslarecomendada.
MuchosobjetosdePyhton,porejemplonmeros,puedenserserializadosencadenasutilizando str o
repr . Estos dos comandos son realmente similares pero producen una salida ligeramente diferente.
Porejemplo:
1 >>>foriin[3,'hola']:
2 printstr(i),repr(i)
3 33
4 hola'hola'
Para las clases definidas por el usuario, str y repr pueden definirse/redefinirse utilizando los
operadores especiales __str__ y __repr__ . Estos se describirn bsicamente ms adelante para
mayor informacin, consulta la documentacin oficial de Python [pydocs]. repr siempre tiene un valor
pordefecto.
OtracaractersticaimportantedeunacadenadePythonesque,comounalista,esunobjeto iterable
1 >>>foriin'hola':
2 printi
3 h
4 o
5 l
6 a
list
LosmtodosprincipalesdeunalistadePythonsonappend,insert,ydelete:
1 >>>a=[1,2,3]
2 >>>printtype(a)
3 <type'list'>
4 >>>a.append(8)
5 >>>a.insert(2,7)
6 >>>dela[0]
7 >>>printa
8 [2,7,3,8]
9 >>>printlen(a)
10 4
Laslistassepuedencortar( slice ):
1 >>>printa[:3]
2 [2,7,3]
3 >>>printa[1:]
4 [7,3,8]
5 >>>printa[2:]
6 [3,8]
yconcatenar:
1 >>>a=[2,3]
2 >>>b=[5,6]
3 >>>printa+b
4 [2,3,5,6]
Unalistaesiterablepuedesrecorrerlaenunbucle:
1 >>>a=[1,2,3]
2 >>>foriina:
3 printi
4 1
5 2
6 3
Loselementosdeunalistanotienenqueserdelmismotipopuedenserdecualquiertipodeobjetode
Python.
Hay una situacin muy comn en la que se puede usar una lista por comprensin o
listcomprehension .Consideremoselsiguientecdigo:
1 >>>a=[1,2,3,4,5]
2 >>>b=[]
3 >>>forxina:
4 ifx%2==0:
5 b.append(x*3)
6 >>>b
7 [6,12]
Este cdigo claramente procesa una lista de tems, separa y modifica un subconjunto de la lista
ingresadaycreaunanuevalistaresultante,yestecdigopuedeserenteramentereemplazadoporla
siguientelistaporcomprensin:
1 >>>a=[1,2,3,4,5]
2 >>>b=[x*3forxinaifx%2==0]
3 >>>b
4 [6,12]
tuple
Una tupla es como una lista, pero su tamao y elementos son inmutables, mientras que en una lista
son mutables. Si un elemento de una tupla es un objeto, los atributos del objeto son mutables. Una
tuplaestdelimitadaporparntesis.
1 >>>a=(1,2,3)
Entoncessiestofuncionaparaunalista:
1 >>>a=[1,2,3]
2 >>>a[1]=5
3 >>>printa
4 [1,5,3]
laasignacinaunelementonofuncionaparaunatupla:
1 >>>a=(1,2,3)
2 >>>printa[1]
3 2
4 >>>a[1]=5
5 Traceback(mostrecentcalllast):
6 File"<stdin>",line1,in<module>
7 TypeError:'tuple'objectdoesnotsupportitemassignment
Unatupla,comoenlalista,esunobjetoiterable.Ntesequeunatuplaqueconsistadeunelemento
debeincluirunacomaalfinal,comosemuestraabajo:
1 >>>a=(1)
2 >>>printtype(a)
3 <type'int'>
4 >>>a=(1,)
5 >>>printtype(a)
6 <type'tuple'>
Lastuplassonrealmentetilesparaordenarobjetosengruposeficientementeporsuinmutabilidad,y
losparntesissonavecesopcionales:
1 >>>a=2,3,'hola'
2 >>>x,y,z=a
3 >>>printx
4 2
5 >>>printz
6 hola
dict
Un dict (diccionario) de Python es una tabla hash que asocia ( map ) un objetoclave a un objeto
valor.Porejemplo:
1 >>>a={'k':'v','k2':3}
2 >>>a['k']
3 v
4 >>>a['k2']
5 3
6 >>>a.has_key('k')
7 True
8 >>>a.has_key('v')
9 False
Lasclavespuedenserdecualquiertipoaptoparatablahash(int,string,ocualquierobjetocuyaclase
implemente el mtodo __hash__ ). Los valores pueden ser de cualquier tipo. Las claves y valores
diferentes en el mismo diccionario no tienen que ser de un nico tipo. Si las claves son caracteres
alfanumricos,eldiccionariotambinsepuededeclararconunasintaxisalternativa:
1 >>>a=dict(k='v',h2=3)
2 >>>a['k']
3 v
4 >>>printa
5 {'k':'v','h2':3}
1 >>>a=dict(k='v',k2=3)
2 >>>printa.keys()
3 ['k','k2']
4 >>>printa.values()
5 ['v',3]
6 >>>printa.items()
7 [('k','v'),('k2',3)]
1 >>>a=[1,2,3]
2 >>>dela[1]
3 >>>printa
4 [1,3]
5 >>>a=dict(k='v',h2=3)
6 >>>dela['h2']
7 >>>printa
8 {'k':'v'}
1 >>>hash("holamundo")
2 1500746465
Acercadelespaciado
Python usa espaciado/sangra para delimitar bloques de cdigo. Un bloque de cdigo comienza con
una lnea que finaliza con dos puntos, y contina para todas las lneas que tengan igual o mayor
espaciadoquelaprximalnea.Porejemplo:
1 >>>i=0
2 >>>whilei<3:
3 >>>printi
4 >>>i=i+1
5 >>>
6 0
7 1
8 2
Escomnelusodecuatroespaciosparacadaniveldeespaciadooindentation.Esunabuenaprctica
nocombinarlatabulacinconelespacio,porquepuederesultar(invisiblemente)confuso.
for...in
EnPython,puedesrecorrerobjetositerablesenunbucle
1 >>>a=[0,1,'hola','python']
2 >>>foriina:
3 printi
4 0
5 1
6 hola
7 python
1 >>>foriinxrange(0,4):
2 printi
3 0
4 1
5 2
6 3
EstoesequivalentealasintaxisdeC/C++/C#/Java:
1 for(inti=0;i<4;i=i+1){print(i);}
1 >>>a=[0,1,'hola','python']
2 >>>fori,jinenumerate(a):
3 printi,j
4 00
5 11
6 2hola
7 3python
1 >>>foriin[1,2,3]:
2 printi
3 break
4 1
Puedessaltaralaprximaiteracindelbuclesinejecutartodoelbloquedecdigocon continue
1 >>>foriin[1,2,3]:
2 printi
3 continue
4 print'test'
5 1
6 2
7 3
while
El bucle while en Python opera bsicamente como lo hace en otros lenguajes de programacin,
iterandounacantidadindefinidadevecesycomprobandounacondicinantesdecadaiteracin.Sila
condicines False ,elbuclefinaliza.
1 >>>i=0
2 >>>whilei<10:
3 i=i+1
4 >>>printi
5 10
if...elif...else
ElusodecondicionalenPythonesintuitivo:
1 >>>foriinrange(3):
2 >>>ifi==0:
3 >>>print'cero'
4 >>>elifi==1:
5 >>>print'uno'
6 >>>else:
7 >>>print'otro'
8 cero
9 uno
10 otro
1 >>>foriinrange(3):
2 >>>ifi==0or(i==1andi+1==2):
3 >>>print'0or1'
try...except...else...finally
Pythonpuedelanzar(throw)perdn,generarexcepciones(Exception):
1 >>>try:
2 >>>a=1/0
3 >>>exceptException,e:
4 >>>print'epa:%s'%e
5 >>>else:
6 >>>print'sinproblemasaqu'
7 >>>finally:
8 >>>print'listo'
9 epa:integerdivisionormodulobyzero
10 listo
1 >>>try:
2 >>>raiseSyntaxError
3 >>>exceptValueError:
4 >>>print'errorenelvalor'
5 >>>exceptSyntaxError:
6 >>>print'errorsintctico'
7 errorsintctico
1 BaseException
2 +HTTP(definedbyweb2py)
3 +SystemExit
4 +KeyboardInterrupt
5 +Exception
6 +GeneratorExit
7 +StopIteration
8 +StandardError
9 |+ArithmeticError
10 ||+FloatingPointError
11 ||+OverflowError
12 ||+ZeroDivisionError
13 |+AssertionError
14 |+AttributeError
15 |+EnvironmentError
16 ||+IOError
17 ||+OSError
18 ||+WindowsError(Windows)
19 ||+VMSError(VMS)
20 |+EOFError
21 |+ImportError
22 |+LookupError
23 ||+IndexError
24 ||+KeyError
25 |+MemoryError
26 |+NameError
27 ||+UnboundLocalError
28 |+ReferenceError
29 |+RuntimeError
30 ||+NotImplementedError
31 |+SyntaxError
32 ||+IndentationError
33 ||+TabError
34 |+SystemError
35 |+TypeError
36 |+ValueError
37 ||+UnicodeError
38 ||+UnicodeDecodeError
39 ||+UnicodeEncodeError
40 ||+UnicodeTranslateError
41 +Warning
42 +DeprecationWarning
43 +PendingDeprecationWarning
44 +RuntimeWarning
45 +SyntaxWarning
46 +UserWarning
47 +FutureWarning
48 +ImportWarning
49 +UnicodeWarning
Paraunadescripcindetalladadecadauna,consultaladocumentacinoficialdePython.
web2pyexponeslounanuevaexcepcin,llamada HTTP .Cuandoesgenerada,hacequeelprograma
devuelvaunapginadeerrorHTTP(paramssobreestetemaconsultaelCaptulo4).
Cualquier objeto puede ser utilizado para generar una excepcin, pero es buena prctica generar
excepcionesconobjetosqueextiendenunadelasclasesdeexcepcinincorporadas.
def...return
Lasfuncionessedeclaranutilizando def .AqusemuestraunafuncindePythontpica:
1 >>>deff(a,b):
2 returna+b
3 >>>printf(4,2)
4 6
Nohaynecesidad(oforma)deespecificarlostiposdelosargumentosnieltipootiposdevueltos.En
esteejemplo,sedefineunafuncin f paraquetomedosargumentos.
Las funciones son la primer caracterstica sintctica descripta en este captulo para introducir el
conceptode"scope"(alcance/mbito),o"namespace"(espaciodenombres).Enelejemplodearriba,
losidentificadores( identifier ) a y b sonindefinidosfueradelscopedelafuncin f :
1 >>>deff(a):
2 returna+1
3 >>>printf(1)
4 2
5 >>>printa
6 Traceback(mostrecentcalllast):
7 File"<pyshell#22>",line1,in<module>
8 printa
9 NameError:name'a'isnotdefined
Los identificadores definidos por fuera del scope de una funcin son accesibles dentro de la funcin
ntesecmoelidentificador a esmanejadoenelsiguientecdigo:
1 >>>a=1
2 >>>deff(b):
3 returna+b
4 >>>printf(1)
5 2
6 >>>a=2
7 >>>printf(1)#seusaunnuevovalorparaa
8 3
9 >>>a=1#redefinea
10 >>>defg(b):
11 a=2#creaunnuevoalocal
12 returna+b
13 >>>printg(2)
14 4
15 >>>printa#elaglobalnohacambiado
16 1
Si se modifica a , las siguientes llamadas a la funcin usarn el nuevo valor del a global porque la
definicindelafuncinenlazalaubicacindealmacenamientodelidentificador a ,noelvalorde a
mismoalmomentodeladeclaracindelafuncinsinembargo,siseasignaa a dentrodelafuncin
g , la a global no es afectada porque la nueva a local protege el valor global. La referencia del
scopeexternopuedeserutilizadaenlacreacinde"cierres"(closures):
1 >>>deff(x):
2 defg(y):
3 returnx*y
4 returng
5 >>>duplicador=f(2)#duplicadoresunanuevafuncin
6 >>>triplicador=f(3)#triplicadoresunanuevafuncin
7 >>>cuadruplicador=f(4)#cuadruplicadoresunanuevafuncin
8 >>>printduplicador(5)
9 10
10 >>>printtriplicador(5)
11 15
12 >>>printcuadruplicador(5)
13 20
Losargumentosdefuncinpuedentenervalorespordefecto,ypuedendevolvermltiplesresultados:
1 >>>deff(a,b=2):
2 returna+b,ab
3 >>>x,y=f(5)
4 >>>printx
5 7
6 >>>printy
7 3
Los argumentos de las funciones pueden pasarse explcitamente por nombre, y esto significa que el
ordendelosargumentosespecificadosenlallamadapuedeserdiferentedelordendelosargumentos
conlosquelafuncinfuedefinida:
1 >>>deff(a,b=2):
2 returna+b,ab
3 >>>x,y=f(b=5,a=2)
4 >>>printx
5 7
6 >>>printy
7 3
Lasfuncionestambinpuedenaceptarunnmerovariabledeargumentosentiempodeejecucin:
1 >>>deff(*a,**b):
2 returna,b
3 >>>x,y=f(3,'hola',c=4,test='mundo')
4 >>>printx
5 (3,'hola')
6 >>>printy
7 {'c':4,'test':'mundo'}
Aqulosargumentosnopasadospornombre(3,'hola')sealmacenanenlatupla a ,ylosargumentos
pasadospornombre( c y test )sealmacenaneneldiccionario b .
Enelcasoopuesto,puedepasarseunalistaotuplaaunafuncinquerequieraunaconjuntoordenado
deargumentosparaquelos"abra"(unpack):
1 >>>deff(a,b):
2 returna+b
3 >>>c=(1,2)
4 >>>printf(*c)
5 3
yundiccionariosepuede"abrir"parapasarargumentospornombre:
1 >>>deff(a,b):
2 returna+b
3 >>>c={'a':1,'b':2}
4 >>>printf(**c)
5 3
lambda
lambda presentaunaformadedeclararenformafcilyabreviadafuncionessinnombre:
1 >>>a=lambdab:b+2
2 >>>printa(3)
3 5
1 >>>defa(b):
2 returnb+2
3 >>>printa(3)
4 5
1 >>>a=[1,7,2,5,4,8]
2 >>>map(lambdax:x+2,a)
3 [3,9,4,7,6,10]
Este cdigo se hubiese duplicado en tamao si utilizbamos def en lugar de lambda . El problema
principal de lambda es que (en la implementacin de Python) la sintaxis permite una slo una
expresinsimpleaunque,parafuncionesmslargas,puedeutilizarse def yelcostoextradeproveer
un nombre para la funcin disminuye cuando el tamao de la funcin aumenta. Igual que con def ,
lambda puede utilizarse para "condimentar" una funcin: las nuevas funciones se pueden crear
envolviendo funciones existentes de manera que la nueva funcin tome un conjunto distinto de
argumentos:
1 >>>deff(a,b):returna+b
2 >>>g=lambdaa:f(a,3)
3 >>>g(2)
4 5
Haymuchassituacionesdondeestilcondimentar,perounadeellasesespecialmenteapropsitoen
web2py: el manejo del cach. Supongamos que tenemos una funcin pesada que comprueba si un
argumentoesnmeroprimo:
1 defesprimo(numero):
2 forpinrange(2,numero):
3 if(numero%p)==0:
4 returnFalse
5 returnTrue
Estafuncinobviamenteconsumemuchotiempodeproceso.
Supongamosquetenemosunafuncindecach cache.ram quetomatresargumentos:unaclave,una
funcinyunacantidaddesegundos.
1 valor=cache.ram('clave',f,60)
1 valor=d['clave']=f()
La segunda vez que se llame, si la clave est en el diccionario y no es ms antigua del nmero de
segundos especificados (60), devolver el valor correspondiente sin volver a ejecutar la llamada a la
funcin.
1 valor=d['clave']
Cmo podemos almacenar en el cach la salida de la funcin esprimo para cualquier valor de
entrada?Deestaforma:
1 >>>numero=7
2 >>>segundos=60
3 >>>printcache.ram(str(numero),lambda:esprimo(numero),segundos)
4 True
5 >>>printcache.ram(str(numero),lambda:esprimo(numero),segundos)
6 True
class
Como Python es un lenguaje de tipado dinmico, las clases y objetos pueden resultar extraas. De
hechononecesitasdefinirlasvariablesincluidas(atributos)aldeclararunaclase,ydistintasinstancias
de la misma clase pueden tener distintos atributos. Los atributos (attribute) se asocian generalmente
conlainstancia,nolaclase(exceptocuandosedeclarancomoatributosdeclaseo"classattributes",
quevienenaserlas"staticmembervariables"deC++/Java).
Aqusemuestraunejemplo:
1 >>>classMiClase(object):pass
2 >>>miinstancia=MiClase()
3 >>>miinstancia.mivariable=3
4 >>>printmiinstancia.mivariable
5 3
Nteseque pass es un comando que no "hace" nada. En este caso se utiliza para definir una clase
MiClase quenocontienenada. MiClase() llamaalconstructordelaclase(enestecasoelconstructor
por defecto) y devuelve un objeto, una instancia de la clase. El (object) en la definicin de la clase
indica que nuestra clase extiende la clase incorporada object . Esto no es obligatorio, pero se
consideraunabuenaprctica.
Heaquunaclasemscomplicada:
1 >>>classMiClase(object):
2 >>>z=2
3 >>>def__init__(self,a,b):
4 >>>self.x=a
5 >>>self.y=b
6 >>>defsumar(self):
7 >>>returnself.x+self.y+self.z
8 >>>miinstancia=MiClase(3,4)
9 >>>printmiinstancia.sumar()
10 9
Las funciones declaradas adentro de la clase son mtodos. Algunos mtodos tienen nombres
especiales reservados. Por ejemplo, __init__ es el constructor. Todas las variables son variables
localesdelmtodoexceptuandolasvariablesdeclaradasfueradelosmtodos.Porejemplo, z esuna
"variabledeclase",queequivaleauna"staticmembervariable"deC++quealmacenaelmismovalor
paratodainstanciadelaclase.
Hay que tener en cuenta que __init__ toma 3 argumentos y add toma uno, y sin embargo los
llamamos con dos y ningn argumento respectivamente. El primer argumento representa, por
convencin, el nombre local utilizado dentro del mtodo para referirse a el objeto actual, pero
podramos haber utilizado cualquier otro. self cumple el mismo rol que *this en C++ o this en
Java,pero self noesunapalabrareservada.
Esta sintaxis es necesaria para evitar ambigedad cuando se declaran clases anidadas, como una
clasequeeslocalaunmtododentrodeotraclase.
Atributosespeciales,mtodosyoperadores
Los atributos de clase, mtodos y operadores que comienzan con doble guin bajo ( __ ) estn
usualmente como privados (por ejemplo para usarse internamente pero no expuestos fuera de la
clase)aunqueestaconvencinnoestcontroladaenelintrprete.
Algunosdeellossonpalabrasreservadasytienenunsignificadoespecial.
Aqusemuestran,comoejemplo,tresdeellos:
__len__
__getitem__
__setitem__
Sepuedenusar,porejemplo,paracrearunobjetocontenedorquesecomportacomounalista:
1 >>>classMiLista(object):
2 >>>def__init__(self,*a):self.a=list(a)
3 >>>def__len__(self):returnlen(self.a)
4 >>>def__getitem__(self,i):returnself.a[i]
5 >>>def__setitem__(self,i,j):self.a[i]=j
6 >>>b=MiLista(3,4,5)
7 >>>printb[1]
8 4
9 >>>b.a[1]=7
10 >>>printb.a
11 [3,7,5]
Entrada/salidadearchivos
EnPythonpuedesabriryescribirenunarchivocon:
1 >>>archivo=open('miarchivo.txt','w')
2 >>>archivo.write('holamundo')
3 >>>archivo.close()
Enformasimilar,puedesleerloescritoenelarchivocon:
1 >>>archivo=open('miarchivo.txt','r')
2 >>>printarchivo.read()
3 holamundo
Como alternativa, puedes leer en modo binario con "rb", escribir en modo binario con "wb", y abrir el
archivoenmodoincremental(append)con"a",utilizandolanotacinestndardeC.
Elcomandodelectura read tomaunargumentoopcional,queeselnmerodebyte.Puedesadems
saltaracualquierubicacinenelarchivousando seek .
Puedesrecuperarloescritoenelarchivocon read
1 >>>printarchivo.seek(5)
2 >>>printarchivo.read()
3 mundo
ypuedescerrarelarchivocon:
1 >>>archivo.close()
EnladistribucinestndardePython,conocidacomoCPython,lasvariablessoncalculadasporreferencia
("referencecounting"),incluyendoaquellasquemanejanarchivos,asqueCPythonsabequecuandoleconteo
porreferenciadeunarchivoabiertodisminuyehastacero,elarchivodeberacerrarseylavariabledescartada.
Sinembargo,enotrasimplementacionesdePythoncomoPyPy,seusalarecoleccindebasuraenlugardel
conteodereferencias,yesoimplicaqueesposiblequeseacumulendemasiadosmanejadoresdearchivos
abiertosalmismotiempo,resultandoenunerrorantesque"gc"tengalaopcincerrarlosydescartarlosatodos.
Poresoesmejorcerrarexplcitamentelosmanejadoresdearchivoscuandoyanosenecesitan.web2pyprovee
dedosfuncionesayudantes, read_file() y write_file() enelespaciodenombresde gluon.fileutils
queencapsulanelaccesoalosarchivosyaseguranquelosmanejadoresdearchivosenusosecierren
oportunamente.
Cuandoutilizasweb2py,nosabesdndeseubicaeldirectorioactual,porqueesodependedelaformaenque
sehallaconfiguradoelmarcodedesarrollo.Lavariable request.folder contienelaruta(path)alaaplicacin
actual.Lasrutaspuedenconcatenarseconelcomando os.path.join ,delhablamosmsadelante.
exec , eval
AdiferenciadeJava,Pythonesrealmenteunlenguajeinterpretado.Estosignificaquetienelahabilidad
deejecutarcomandosdePythonalmacenadosencadenas.Porejemplo:
1 >>>a="print'holamundo'"
2 >>>exec(a)
3 'holamundo'
1 >>>a="printb"
2 >>>c=dict(b=3)
3 >>>exec(a,{},c)
4 3
1 >>>a="3*4"
2 >>>b=eval(a)
3 >>>printb
4 12
import
ElverdaderopoderdePythonestensuslibrerasdemdulos.Ellosproveenungranyconsistente
conjuntodeInterfacesdeProgramacindeAplicaciones(API)paramuchaslibrerasdelsistema(a
menudoenunmodoindependientedelsistemaoperativo).
Porejemplo,sinecesitamosutilizarunnmeroaleatorio,podemoshacer:
1 >>>importrandom
2 >>>printrandom.randint(0,9)
3 5
Esto imprime un entero aleatorio entre 0 y 9 (incluyendo al 9), 5 en el ejemplo. La funcin randint
estdefinidaenelmdulo random .Ademsesposibleimportarunobjetodeunmduloenelespacio
denombresactual:
1 >>>fromrandomimportrandint
2 >>>printrandint(0,9)
oimportartodoobjetodeunmduloenelespaciodenombresactual:
1 >>>fromrandomimport*
2 >>>printrandint(0,9)
oimportartodoenunnuevoespaciodenombresespecfico:
1 >>>importrandomasmyrand
2 >>>printmyrand.randint(0,9)
En adelante, vamos a usar objetos principalmente definidos en mdulos como os , sys , datetime ,
time y cPickle .
Enlasseccionessiguientesdescribiremosaquellosmdulosquesondemayorutilidad.
os
EstemduloproveedeunainterfazalaAPIdelsistemaoperativo.Porejemplo:
1 >>>importos
2 >>>os.chdir('..')
3 >>>os.unlink('archivo_a_borrar')
os.path.join es de gran utilidad permite concatenar rutas a directorios y archivos en una forma
independientedelsistemaoperativo:
1 >>>importos
2 >>>a=os.path.join('ruta','sub_ruta')
3 >>>printa
4 ruta/sub_ruta
Lasvariablesdeentornodelsistemasepuedenexaminarcon:
1 >>>printos.environ
queesundiccionariodeslolectura.
sys
El mdulo sys contiene muchas variables y funciones, pero la que ms usamos es sys.path .
Contiene una lista de rutas (path) donde Python busca los mdulos. Cuando intentamos importar un
mdulo,Pythonlobuscaentodoslosdirectorioslistadosen sys.path .Siinstalasmdulosadicionales
en alguna ubicacin y quieres que Python los encuentre, necesitas aadir (append) en sys.path la
rutaopathaesaubicacin.
1 >>>importsys
2 >>>sys.path.append('ruta/a/mis/mdulos')
1 >>>ruta='ruta/a/mis/mdulos'
2 >>>ifnotrutainsys.path:
3 sys.path.append(ruta)
datetime
Elusodelmdulo datetime esmsfcildedescribirporalgunosejemplos:
1 >>>importdatetime
2 >>>printdatetime.datetime.today()
3 2008070414:03:90
4 >>>printdatetime.date.today()
5 20080704
De vez en cuando puedes necesitar una referencia cronolgica para los datos (timestamp) segn el
tiempodeUTCenlugardeusarlahoralocal.Enesecasopuedesusarlasiguientefuncin:
1 >>>importdatetime
2 >>>printdatetime.datetime.utcnow()
3 2008070414:03:90
El mdulo datetime contiene varias clases: date (fecha), datetime (fecha y hora), time (hora) y
timedelta.Ladiferenciaentredosobjetosdateodosdatetimeodostimeesuntimedelta:
1 >>>a=datetime.datetime(2008,1,1,20,30)
2 >>>b=datetime.datetime(2008,1,2,20,30)
3 >>>c=ba
4 >>>printc.days
5 1
Enweb2py,dateydatetimeseusanparaalmacenarlostiposdedatosSQLcorrespondientescuando
sepasandesdeoalabasededatos.
time
Elmdulotimedifierede date o datetime porquerepresentaeltiempoensegundosdesdeelepoch
(comenzandodesde1970)
1 >>>importtime
2 >>>t=time.time()
3 1215138737.571
ConsultaladocumentacindePythonparaotrasfuncionesdeconversinentretiempoensegundosy
tiempocomo datetime .
cPickle
Este es un mdulo realmente poderoso. Provee de funciones que pueden serializar casi cualquier
objeto de Python, incluyendo objetos autoreferidos (selfreferential). Por ejemplo, vamos a crear un
objetoinusual:
1 >>>classMiClase(object):pass
2 >>>miinstancia=MiClase()
3 >>>miinstancia.x='algo'
4 >>>a=[1,2,{'hola':'mundo'},[3,4,[miinstancia]]]
yahora:
1 >>>importcPickle
2 >>>b=cPickle.dumps(a)
3 >>>c=cPickle.loads(b)
1 >>>cPickle.dump(a,open('myfile.pickle','wb'))
2 >>>c=cPickle.load(open('myfile.pickle','rb'))
Copyright2017byMassimoDiPierro,licensedunderCreativeCommonLicenseBYNCND3.0
Poweredbyweb2py