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