Как сделать пароль звездочками в python

Обновлено: 04.07.2024

Я разрабатываю демон резервного копирования, который будет работать в фоновом режиме. Демон полагается на duplicity резервное программное обеспечение, которое при резервном копировании требует ключа шифрования. Я не могу запросить пароль через консоль, потому что, очевидно, у демона нет доступа к такому.

Как я могу легко создать приглашение, которое просит пользователя ввести пароль, и возвращает его приложению (через переменную в Python)? Я использую Python 2.7.

потому что вы попросили простой (Python 2.7):

потому что не все хотят использовать TK, вот скрипт, использующий PyQt:

и, потому что вы обычно не просто спрашиваете у пользователя пароль только для этого:

и соответствующая функция bash:

решены вопросы области @pycoder112358 post:

расширение ответа Диего с некоторым минимальным домашним хозяйством (без этого я получал аварии в изобилии, пытаясь использовать его красиво краткий пример):

Это будет хорошо работать с программой, которая в противном случае просто терминал / консольное приложение.

Оператор звездочка в Python

Достаточно универсальным и при этом удобным оператором в Python является оператор *. Давайте рассмотрим его, но для начала вспомним о множественном присваивании в Python.

Код ниже распределяет значения по переменным в соответствии с их порядком.

a, b, c = 1, 2, 3
print(a,b,c)

То же самое будет и со значением в виде списка.

a, b, c = ["hi", 2, False]
print(a,b,c)

Но если мы добавим четвертый параметр в список, то получим ошибку, то же самое и с меньшим количеством параметров.

Вот здесь-то нам и пригодится вышеупомянутый оператор *. Просто поставим его перед одной из наших переменных:

a, b, *c = ["hi", 2, False, True, 10, 11]

При этом присваивание произведется по порядку, начиная с первого, а вывод будет следующим:

hi, 2, [True, 10, 11]

В примере выше Python оператор звездочка * - просто упаковал все оставшиеся значения в список, благодаря чему и состоялось присваивание. При другом способе присваивание будет происходить с конца, и оставшиеся значения войдут в список

*a, b, c = ["hi", 2, False, True, 10, 11]

Подобные операции присваивания справедливы для любых объектов последовательностей, в том числе для строк

*a, b, с = "Hello World"
print(a,b,с)

Минимальное количество значений здесь равно 2, т.е. присваивание одного единственного значения в данном случае вызовет ошибку.

Еще один пример, но уже с функцией:

def f(a, b, с, d):
print(a, b, с, d)

Но если попытаться передать в функцию список:

a = ["hello", True, 70, [4,6,8]]

Следующий вариант предполагает использование нашего оператора при определении функции, что позволяет передавать в нее произвольное количество неименованных аргументов. Сама же функция будет возвращать эти аргументы в виде кортежа. Следует заметить, что в качестве параметра функции передается слово args.

def f (*args):
print(args)

Т.о. сегодня мы свами узнали, как с помощью всего одного оператора упростить написание кода.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 0 ):

Снимок далекой звезды в космосе

Умножение и размножение

Самое простое применение одиночного астериска: умножение чисел. Двойного – возведение числа в степень.

Если мы умножим список (или кортеж) на целое число, то получим новый список (или кортеж), где элементы исходного повторены несколько раз. Подобное случится и со строкой. Если мы умножаем на ноль (0) или на число меньше ноля, то получим пустой список, кортеж или строку.

Звезды в аргументах функций

Одна звездочка позволяет получить все или некоторые позиционные аргументы функции в виде кортежа. Позиционные – это те, которые просто подряд передаются без указания имени. Те, что с именем, это аргументы ключевого слова. Разберемся сначала с первыми. Ниже идут два примера. В первом мы получаем все позиционные аргументы в кортеж с названием args. Во втором случае мы обязуем пользователя наших функций передать как минимум 2 аргумента (они попадут в x и y) и дополнительно произвольное число (можно ни одного) аргументов, которые попадут в кортеж rest. Я специально развал их по-разному, не обязательно всегда называть их args. Обратите внимание, что это всегда будет кортеж, даже если мы передадим один аргумент, то получим кортеж из одного элемента.

Пример такой функции мы недавно рассматривали – это хорошо знакомый нам print. Как известно, он принимает произвольное число аргументов, пользуясь выше описанным механизмом. Можете пройти по ссылке и увить его сигнатуру.

Две звездочки перед названием аргумента позволяют нам получить произвольное число произвольно названных именованных аргументов (еще их называют аргументами ключевых слов). Такую переменную часто называют **kwargs (от key-word arguments). В нее будет записан словарик (dict) из пар название ключевого слова (строка) и значение аргумента. Давайте обратимся к примерам:

Как видно, без аргументов мы получили пустой словарь. А с именованными аргументами получили словарь, где их имена – ключи-строки, а их значения – собственно сами переданные значений. В функцию baz нельзя передать аргументы без имен, будет ошибка, потому что без имен – позиционные аргументы, а мы никак их не обозначили.

Тут мы требуем ровно два позиционных аргумента (x и y – обязательные аргументы) и любое количество аргументов ключевых слов, которые попадут в kwargs. Нюанс: мы может передать x и y по именам (последний пример), но они не попадут в kwargs, а останутся только в своих соответствующих переменных x и y, и только z попал в kwargs, потому что мы заранее его не объявили.

Можно сочетать *args и **kwags в одной функции, причем именно в этом порядке.

Еще одно применение звездочки – заставить вызывать функцию, указывая название аргументов в обязательном порядке.

Имя x мы можем и не указывать, просто передадим значение, но cat и dog мы обязаны указать по имени. Зачем это надо? Если функция принимает много разных аргументов, то мы можем принудить указывать имена, чтобы пользователь не перепутал их порядок. Еще такой код просто выглядит более читаемым.

Раскрытие коллекций в аргументах функций при вызове

Также звездочка и двойная звездочка находят применение по другую сторону баррикад – при вызове функции. В предыдущем разделе мы обсуждали, как получать аргументы, а сейчас говорим о том, как их передавать.

Передавая кортеж или список со одной звездочкой – он раскроется в череду позиционных аргументов. Справа от звездочки может быть как имя переменной, так и литерал коллекции или даже вызов функции. Определим две функции: в одной foo – переменное число позиционных аргументов, в другой fixed_foo – фиксированное (три).

В foo мы вольны передать список или кортеж любой длины, а в fixed_foo мы обязаны передать список или кортеж длины 3, не больше, не меньше.

Допускается использовать в одном вызове звездочку несколько раз:

Можно догадаться, что двойная звездочка несет схожую функциональность – раскрывает словарь в именованные аргументы функции.

Если у нас нет **kwargs, то передаваемый словарь должен содержать ровно столько пар ключ-значение, сколько есть аргументов в функции (без значения по-умолчанию, естественно), причем ключи должен совпадать по именам с названиями аргументов (а вот порядок не важен). То есть при ‘a’: 1 в a попадет 1 и так далее.

В примерах выше мы передаем один аргумент явно и два аргумента словарем.

Возможны разнообразные варианты вызова функции. Даже такие:

Склеивание списков и словарей

Это похоже на то, как мы склеиваем коллекции оператором плюс (+), вот только плюсом нельзя соединить кортеж и список, будет ошибка. А через звездочку можно. Но согласитесь, сложение читается понятнее и легче.

Со словарями это немного полезнее. Применение двойной звезды (**) позволяет обновить один словарь элементами другого или нескольких других.

Работает похоже, как метод update, но не меняет исходные словари, а создает новый. Если есть совпадающие ключи, то будет взято значение последнего из них:

Распаковка

Позволяет раскидывать по переменным содержимое сложных структур из списков и кортежей. В переменную со звездочкой попадут в виде списка все остальные значения распакуемой структуры, кроме указанных явно. Лучше это понять на примерах:

Имя со звездочкой может быть как в начале, так и в конце кортежа и даже в середине. В последнем и в предпоследнем примере мы берем первый (a), второй (b) элементы; потом все, кроме последнего в middle пойдут как список, и последний в – c.

Если у нас один элемент со звездочкой и ни одного без звездочки – мы должны после него указать запятую (признак кортежа).

Не важно в какие скобки мы обернем верхний уровень: в круглые, квадратные или в никакие. Обычно скобки опускают.

На одном уровне может быть только 1 элемент со звездой.

На нескольких уровней могут быть свои звездные выражения:

При таком присваивании значения переменных копируются.

Справа от звездного присваиванию могут быть любые итераблы, например range:

Пока это все применения звездочки в Python, которые мне удалось вспомнить или найти.

Этот вопрос был задан ранее, и, насколько я вижу, до сих пор нет ответа. Поэтому я снова задаю этот вопрос, чтобы, возможно, наконец получить ответ на этот вопрос. (Если я ошибаюсь, пожалуйста, дайте мне URL ответа.)

Проблема: программисты хотят, чтобы пользователи вводили пароли. Функция getpass() хороша для этой цели, но ее использование имеет недостаток: при вводе пароля на стандартный вывод ничего не выводится.

Вопрос: как можно реализовать getpass(), пока звездочки печатаются для каждого символа, набранного пользователем? (Конечно, о backspace - и в идеале pos1 и end - нужно позаботиться соответственно.)

Мотивация: были люди в сообществе, не понимающие, почему этот вопрос был задан. А затем сослался на getpass() с a) таким образом, игнорируя поставленную задачу и b), не думая о том, что ссылка не ответит на вопрос. Причина, по которой так хочется печатать звездочки, заключается в удобстве пользователей: они получают прямой визуальный ответ при вводе пароля. Поэтому их не смущают нажатия клавиш и, кажется, ничего не происходит.

Шаг к решению:

Позвольте мне представить первый шаг к решению здесь. Пожалуйста, помогите, чтобы превратить это в реальное решение.

Есть модуль с именем getch, который, кажется, позволяет читать символ за символом из stdin. Backspace - как ни странно - отображается на целочисленное значение 127, но такое решение может тогда выглядеть так:

Но у этого кода есть некоторые недостатки. Во-первых, я очень озадачен тем, что не могу быть '\b', если так войду в забой. Может быть, так есть объяснение этому? Во-вторых, обрабатываются только символы ASCII, по крайней мере, в Linux. Я не знаю о Windows здесь, но если нажать символ, отличный от A-Z0-9, строка c = getch.getch() выдаст исключение. Похоже, что getch () не может обрабатывать умлауты и другие символы, по крайней мере, до некоторой степени.

Чтобы прийти к решению проблемы, необходимо решить следующие вопросы:

  • Как можно выполнить чтение из stdin посимвольно относительно символов, не относящихся к ASCII?
  • Как это можно сделать независимым от платформы способом?
  • Как это можно сделать безопасно (без проблем с безопасностью)? (getpass как-то решает эту проблему, но я не совсем понимаю, как.)

Может быть, никто не знает об этом. Насколько мне известно, такие вопросы, как это было задано ранее, остались без ответа. Но, может быть, есть несколько разработчиков программного обеспечения в сообществе, которые знают обо всем этом больше и могут помочь здесь? В случае успеха я могу получить решение, предоставленное на GitHub в виде модуля Python.

При получении доступа к информационным ресурсам, особенно в условиях удаленной работы нам нередко приходится сталкиваться с придумыванием надежного пароля. А если ресурсов много (корпоративные, публичные, частные и т.п.), и по требованиям кибербезопасности пароли к разным информационным ресурсам тоже должны быть разными, как избежать их повторяемости и избавиться от муки креативности в данном вопросе?

Предлагаем поручить задачу генерации надежного пароля программе на языке Python (пусть у питона голова болит))).

Условия, предъявляемые различными ресурсами, к надежности пароля чаще всего следующие:

  • Пароль содержит не менее 12 символов
  • Пароль содержит хотя бы одну заглавную букву
  • Пароль содержит хотя бы одну строчную букву
  • Пароль содержит хотя бы одну цифру
  • Пароль содержит хотя бы один спецсимвол

Вот как это можно реализовать с помощью Python:

И при каждом запуске кода, вы будете получать уникальный пароль, соответствующий всем необходимым требованиям.

Читайте также: