Мда… Я пример пересократил. В “реальной жизни” я всё-таки выбираю не все символы, так что распределение выборки может поплыть. Так что на сам рандом тут гнать преждевременно. Ступил.
Вот пример получше:
pw = ''
pwl = rnd(15, 25)
while len(pw) < pwl:
ch = chr(rnd(0x30, 0xFF))
if (ch >= 'A')&(ch <= 'Z'): pw += ch
elif (ch >= 'a')&(ch <= 'z'): pw += ch
elif (ch >= '0')&(ch <= '9'): pw += ch
elif '`~!@#$%^&*(){}[]?_+-="|/\<>,.'.find(ch) >= 0: pw += ch
# elif (ch >= 'А')&(ch <= 'Я'): pw += ch
# elif (ch >= 'а')&(ch <= 'я'): pw += ch
print pw
Пока “пофиксил” ограничением на количество одинаковых символов.
Плюс, есть проблема с русскими буквами: если разрешить их, то через print они выводятся правильно, но, например, вставляются через буфер обмена кракозябрами. При этом encode не помогает: на кириллице вылетает exception “нет такого символа в таблице”. Странно: почему строка из “честного юникода” не хочет быть перекодированной в cp1251… Или опять же, я неправ, что любая строка в питоне - юникодная.