I looked on your code and would say the following:
1) If I typed desired password length, e.g. 2, I would get a password of len 4. This slightly confuses. You need to note somewhere in docs, that program generates passwords longer 4 symbols only.
2) You defined
ALPHABET
and other auxiliary strings; however, these strings already defined in
string
module. You could just import them.
3) Program implementation guarantees that the first 4 symbols of a password came from 4 different classes (lowercase, uppercase, numbers, punctuation). However, other symbols are generated randomly: In
rc.all
you generated 4 symbols from these classes and then chose one of them. This is totally equivalent to choosing one symbol from the entire set of symbols (lowercase+uppercase+nums+puncts).