Sie sind auf Seite 1von 24

web2py Books Contribute

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 ...

y,como"1"esunentero,obtenemosunadescripcindelaclase int ydetodossusmtodos.Aqula


salidafuetruncadaporqueesrealmentelargaydetallada.
Enformasimilar,podemosobtenerunalistademtodosdelobjeto"1"conelcomando dir :

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}

has_key , keys , values y items sonmtodostiles:

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)]

Elmtodo items produceunalistadetuplas,cadaunaconteniendounaclaveysuvalorasociado.

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'}

Internamente,Pythonutilizaeloperador hash paraconvertirobjetosenenteros,yusaeseenteropara


determinardndealmacenarelvalor.

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

Unatajousuales xrange ,quegeneraunrangoiterablesinalmacenarlalistaenteradeelementos.

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);}

Otrocomandodeutilidades enumerate ,querealizaunconteomientrasavanzaelbucle:

1 >>>a=[0,1,'hola','python']
2 >>>fori,jinenumerate(a):
3 printi,j
4 00
5 11
6 2hola
7 3python

Tambinhayunkeyword range(a,b,c) quedevuelveunalistadeenteroscomenzandoconelvalor


a yconunincrementode c ,yquefinalizaconelltimovalormenora b .Pordefecto, a es0y c
es1. xrange es similar es similar pero en realidad no genera una lista, slo un iterator para la lista
queesmsapropiadoparacrearestosbucles.
Sepuedesalirdeunbucleutilizando break

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

Nohayunainstruccinespecial loop...until enPython.

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

"elif"significa"elseif".Tanto elif como else sonpartesopcionales.Puedehabermsdeuna elif


peroslounadeclaracin else .Sepuedencrearcondicionalescomplicadosutilizandolosoperadores
not , and y or .

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

Silaexcepcinsegenera(raise),esatrapadaporlaclusula except ,queesejecutadanoseejecuta


encambiolaclusula else .Sinosegeneraningunaexcepcin,laclusulade except noseejecuta,
pero en cambio la de else s. La clusula de finally se ejecuta siempre. Puede haber mltiples
clusulas except paradistintasexcepcionesposibles:

1 >>>try:
2 >>>raiseSyntaxError
3 >>>exceptValueError:
4 >>>print'errorenelvalor'
5 >>>exceptSyntaxError:
6 >>>print'errorsintctico'
7 errorsintctico

Lasclusulas else y finally sonopcionales.


Aqumostramosunalista

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

Lafuncin f creanuevasfuncionesyntesequeelscopedelnombre g esenteramenteinternoa


f .Loscierressonextremadamentepoderosos.

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

Laexpresin" lambda [a]:[b]"seleeexactamentecomo"unafuncinconargumentos[a]quedevuelve


[b]". La expresin lambda es annima, pero la funcin adquiere un nombre al ser asignada a un
identificador a . Las reglas de espacios de nombres para def tambin son igualmente vlidas para
lambda ,ydehechoelcdigodearriba,conrespectoa a esidnticoaldeladeclaracindelafuncin
utilizando def :

1 >>>defa(b):
2 returnb+2
3 >>>printa(3)
4 5

Lanicaventajade lambda eslabrevedadsinembargo,labrevedadpuedesermuyconvenienteen


ciertasocasiones.Consideremosunafuncinllamada map queaplicaunafuncinatodoslostemsen
unalista,creandounalistanueva:

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)

Laprimeravezquesellame,llamarasuvezalafuncin f() ,almacenarlasalidaenundiccionario


enmemoria(digamos"d"),ylodevolverdemaneraqueelvalores:

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

Lasalidaessiemprelamisma,perolaprimeravezquesellamaa cache.ram ,sellamaa esprimo la


segundavez,no.
LasfuncionesdePython,creadastantocon def comocon lambda permitenrefactorizarfuncionesexistentes
entrminosdeunconjuntodistintodeargumentos. cache.ram y cache.disk sonfuncionesparamanejode
cachdeweb2py.

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]

Entreotrosoperadoresespecialesestn __getattr__ y __setattr__ , que definen los atributos get y


setparalaclase,y __sum__ y __sub__ ,quehacensobrecargadeoperadoresaritmticos.Paraeluso
de estos operadores se pueden consultar textos ms avanzados en este tema. Ya mencionamos
anteriormentelosoperadoresespeciales __str__ y __repr__ .

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'

Quhaocurrido?Lafuncin exec ledicealintrpretequesellameasmismoyejecutelecontenido


delacadenapasadacomoargumento.Tambinesposibleejecutarelcontenidodeunacadenaenel
contextodefinidoporlossmbolosdeundiccionario:

1 >>>a="printb"
2 >>>c=dict(b=3)
3 >>>exec(a,{},c)
4 3

Aqu el intrprete, cuando ejecuta la cadena a , ve los smbolos definidos en c ( b en el ejemplo),


peronovea c o a .Estonoesequivalenteaunentornorestringido,porque exec noimponelmites
aloqueelcdigointeriorpuedahacerslodefineelconjuntodevariablesvisiblesenelcdigo.
Unafuncinrelacionadaes eval ,quehacealgomuyparecidoa exec ,peroesperaqueelargumento
pasadoevaleaunvalordado,ydevuelveesevalor.

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 .

TodoobjetodePythonesaccesibleatravsdeunmdulollamado gluon yeseeseltemadecaptulos


posteriores.Internamente,web2pyusamuchosmdulosdePython(porejemplo thread ),perosloenraras
ocasionesnecesitarsaccederaellosenformadirecta.

Enlasseccionessiguientesdescribiremosaquellosmdulosquesondemayorutilidad.

os
EstemduloproveedeunainterfazalaAPIdelsistemaoperativo.Porejemplo:

1 >>>importos
2 >>>os.chdir('..')
3 >>>os.unlink('archivo_a_borrar')

Algunasdelasfuncionesde os ,como chdir ,NODEBENusarseenweb2py,porquenosonaptasparael


procesoporhilos("threadsafe").

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')

Cuando corremos web2py, Python permanece residente en memoria, y se configura un nico


sys.path , aunque puede haber varios hilos respondiendo a las solicitudes HTTP. Para evitar la
prdida de espacio en memoria (leak), es mejor comprobar que una ruta ya est presente antes de
aadirla:

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)

En el ejemplo, b is una cadena que representa a , y c es una copia de a generada por la


deserializacinde b .
cPicklepuedeademsserializarydeserializardesdeunarchivo:

1 >>>cPickle.dump(a,open('myfile.pickle','wb'))
2 >>>c=cPickle.load(open('myfile.pickle','rb'))

Copyright2017byMassimoDiPierro,licensedunderCreativeCommonLicenseBYNCND3.0
Poweredbyweb2py

Das könnte Ihnen auch gefallen