从@JasonS 的优秀答案中恶意窃取,这是我在评论中提到的有点玩弄的方法。
# :: all functions look just like this one! ::
import functools, operator
def pass_len(password, length=6):
try:
if len(password) < length:
return 0b0001
else:
return 0
except Exception as e:
return 0b0001
# pass_upper returns 0b0010 or 0
# pass_lower returns 0b0100 or 0
# pass_nums returns 0b1000 or 0
def password_validate(password):
conditions = [pass_len, pass_upper, pass_lower, pass_nums]
result = functools.reduce(operator.or_, map(lambda x: x(password), conditions))
errors = [message for (bitflag, message) in (
(0b0001, 'Password must be at least 6 characters long'),
(0b0010, 'Password must include upper case letters'),
(0b0100, 'Password must include lower case letters'),
(0b1000, 'Password must include digits.')
) if result & bitflag]
for error in errors:
print(error)
输出:
>>> password_validate("hunter12")
Password must include upper case letters
>>> password_validate("HUNTER")
Password must include lower case letters
Password must include digits.
>>> password_validate('')
Password must be at least 6 characters long
Password must include upper case letters
Password must include lower case letters
Password must include digits.
您可以通过以下方式进一步干燥:
def password_validator(bitflag):
def wrap(f):
def wrapped_f(*args):
return bitflag if f(*args) else 0
return wrapped_f
return wrap
@password_validator(0b0001)
def pass_len(password, length=6):
return len(password) < length
@password_validator(0b0010)
def pass_upper(password):
return password.lower() == password
@password_validator(0b0100)
def pass_lower(password):
return password.upper() == password
@password_validator(0b1000)
def pass_num(password):
return any(num in password for num in '0123456789')
def password_validate(password):
# this function is identical to the one above