Как использовать kwargs в качестве флагов без =True?

Я работаю над модулем Python, который извлекает, загружает/обновляет, а затем автоматически устанавливает другие модули. Как использовать **kwargs (или альтернативу) без необходимости =True в конце для системы «флагов»?

Я не очень опытен в целом, поэтому я не уверен, что здесь делать

В настоящее время, чтобы флаг молчания работал, он должен выглядеть так:

pyup.imp(["psutil","shutil","os","sys","pyinstaller"],silent=True)

но я хочу, чтобы функция вызова выглядела так:

pyup.imp(["psutil","shutil","os","sys","pyinstaller"],silent)

Сама функция выглядит так (в pyup.py):

def imp(libs = [], *args, **kwargs):

где libs[] — массив, содержащий нужные библиотеки.

Как сделать так, чтобы вызов функции не требовал "=True"?

Есть способы заставить это работать, но имейте в виду, что это не будет «питоновским», и поэтому обычно не рекомендуется.

Konrad Rudolph 29.04.2019 16:34

В качестве примечания: будьте очень осторожны с изменяемым аргументом по умолчанию (stackoverflow.com/questions/1132941/…).

DeepSpace 29.04.2019 16:37

Для меня обозначение imp([...], silent) подразумевает, что молчание — это какая-то локальная переменная, передаваемая функции. silent=True, на мой взгляд, более читабельно.

TheHowlingHoaschd 29.04.2019 16:38

Чтобы это произошло, нужно либо а) silent быть явно позиционным (imp(libs, silent, *args, **kwargs)), либо б) подразумевать, где silent находится в *args, например silent, *args = args. Кроме того, вы не хотите, чтобы lists или другие изменяемые структуры данных использовались по умолчанию в функциях.

C.Nivs 29.04.2019 16:38

Python предпочитает быть явным, а silent=True — явным. Так что рекомендую использовать то, что есть.

wjandrea 22.06.2019 02:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
272
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если мы определили такую ​​функцию, вы не сможете:

def imp(libs = [], *args, **kwargs):

Но если вы определили функцию таким образом, вы можете:

def imp(libs = [], silent = True, *args, **kwargs):

и действительно, так же, как вы написали, вы можете запустить это без проблем:

silent = True
imp(["psutils", ...], silent)

только внутри функции у kwargs никогда не будет ключа silent, так как он удерживается другим параметром.

Проблема в том, что это модуль, поэтому я не думаю, что silent = True будет называться

Auxilor 29.04.2019 16:40

Думаю, тогда ответ будет "нет".

adrtam 29.04.2019 16:44
Ответ принят как подходящий

Если вы хотите передать серию строковых флагов в свою функцию (как если бы это было терминальное приложение), вы можете передать их как безымянные позиционные аргументы через *args.

def imp(libs=[], *args):
    silent = '--silent' in args

# somewhere else
imp([...], '--silent')

Однако они должны быть строками, я не думаю, что вашу нотацию можно заставить работать в python.

TheHowlingHoaschd 29.04.2019 16:46

Это хорошо работает. Просто интересно, можно ли "объявить" --silent как пустую переменную или что-то подобное, чтобы получить вызов, например: python imp([...], --silent)

Auxilor 29.04.2019 16:50

Нет, это невозможно. Если вы вставите такое имя, python всегда будет искать его в той области видимости, где вызывается функция. Только синтаксис silent=True интерпретирует silent в области действия функции (или передает его в **kwargs, если параметр silent не определен).

TheHowlingHoaschd 30.04.2019 15:05

Другие вопросы по теме