> I've got a small function that I'm using to check whether a password is of a > certain length and contains mixed case, numbers and punctuation. > > Originally I was using multiple "if re.search" for the patterns but it looked > terrible so I've read up on list comprehensions and it's slightly improved. I > just can't escape the feeling that there's a more elegant way to do this that > I'm missing. > > I've been looking through all the python stuff that I thought might be > relevant (lambda, map, filter, set, frozenset, etc) but nothing has come > together. Just wondering if anyone has suggested reading material for > alternate ways they'd handle this code.
set does seem to have what you want: isdisjoint() could do the trick. Eg: if set(punctuation).isdisjoint(password) or set(digits).isdisjoint(password) or set(ascii_uppercase).isdisjoint(password) or set(ascii_lowercase).isdisjoint(password): return False return True You could even confuse yourself and put it all on one line: return not any(set(chars).isdisjoint(password) for chars in [punctuation, digits, ascii_uppercase, ascii_lowercase]) but I wouldn't recomended it. I guess this can even shortened further. (note: the 'not' operator is needed, because isdisjoint returns True for what you probably prefer as False.) Evert > CODE: > > from string import ascii_lowercase, ascii_uppercase, digits, punctuation > > > def complex_password(password): > """Checks password for sufficient complexity.""" > if len(password) < 12: > return False > if len([c for c in password if c in punctuation]) == 0: > return False > if len([c for c in password if c in digits]) == 0: > return False > if len([c for c in password if c in ascii_uppercase]) == 0: > return False > if len([c for c in password if c in ascii_lowercase]) == 0: > return False > return True > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor