validar informacion

Arnau Sanchez arnau en ehas.org
Lun Jul 23 01:14:12 CEST 2007


joana salgado gomez escribió:

>   def validarInformacionContrasena(self,clave, pwd1, pwd2):
>          lista=list(clave)
>          for i in range(len(lista)-1):
>              if type(lista[i])!='int':
>                  return 'no valida'
>          if type(lista[-1])!='str':
>               return 'no valida'
>          lista=list(pwd1)
>          for i in range(len(lista)):
>               if type(lista[i])!='int'or type(lista[i])!='str':
>                   return 'no valida'
>          lista=list(pwd2)
>          for i in range(len(lista)):
>               if type(lista[i])!='int'or type(lista[i])!='str':
>                   return 'no valida'

Y con esto la filosofía Python cae a la lona tras encajar un duro golpe ;-)

Ahora en serio, lo haces como si fuera un lenguaje de bajo nivel (tipo C) pero 
afortunadamente las cosas en Python se pueden hacer de otra forma. Vamos por partes:

 >          lista=list(clave)

¿Por qué pasarlo a lista? una cadena se puede iterar sin ningún problema (aunque 
  no hace falta en este caso). Ejemplo:

for c in clave:
     print "caracter:", c

 >          for i in range(len(lista)):

Las listas (o lo que sea) no se iteran así (mírate el tutorial!):

for elemento in lista:
	print "elemento:", elemento

 >              if type(lista[i])!='int':

Eso nunca va a funcionar, los tipos son int/str/float, a secas, si lo pones 
entre comillas no es más que una vulgar cadena. De todas formas, tampoco 
deberías hacer esa comparación.

 >                   return 'no valida'

Uf, definitivamente devolver cadenas no es las forma más adecuada de indicar si 
una función ha ido bien. Python es un lenguaje que funciona con excepciones, 
deberías usarlas: raise ValueError, "he tenido este problema".

En un nivel superior de la aplicación (en el nivel que te interese, tampoco 
tiene que ser el inmediatamente superior) capturas la excepción y la tratas como 
sea conveniente.

Una propuesta usando expresiones regulares:

import re
def validarInformacionContrasena(clave, pwd1, pwd2):
     def validar(s, regexp, errmsg):
         if not re.match(regexp, s):
             raise ValueError, "Error validando '%s': %s"%(errmsg, s)
     validar(clave, "\d*[A-Za-z]$", "clave")
     validar(pwd1, "\w+$", "pwd1")
     validar(pwd2, "\w+$", "pwd2")

La validación de "clave" que aparece en tu código e sun poco rara, se permiten 
sólo dígitos en los primeros caracteres y sólo letras en el último ¿seguro que 
la clave debe tener esa (extraña) forma?

Si no te gustan las expresiones regulares (aunque *deberías* usarlas en un 
problema de este tipo) podrías jugar con las variables string.ascii_letters y 
string.digits, aunque saldría un poco más largo.




Más información sobre la lista de distribución Python-es