Python 3.2.3. Здесь перечислены некоторые идеи , которые работают с обычными var, но похоже, что ** kwargs играют по другим правилам ... так почему это не работает и как я могу проверить, существует ли ключ в ** kwargs?
if kwargs['errormessage']:
print("It exists")
Я тоже думаю, что это должно сработать, но это не так -
if errormessage in kwargs:
print("yeah it's here")
Я предполагаю, потому что kwargs повторяется? Нужно ли мне перебирать его, чтобы проверить, есть ли там конкретный ключ?
python
dictionary
python-3.x
kwargs
Замфатта
источник
источник
Ответы:
Вы хотите
Чтобы получить значение
errormessage
Таким образом,
kwargs
это просто другоеdict
. Ваш первый пример,if kwargs['errormessage']
означает "получить значение, связанное с ключом errormessage" в kwargs, а затем проверить его значение типа bool ". Так что, если такого ключа нет, вы получите файлKeyError
.Ваш второй пример,
if errormessage in kwargs:
означает «еслиkwargs
содержит элемент, названный«errormessage
», и если«errormessage
»не является именем переменной, вы получитеNameError
.Я должен упомянуть, что словари также имеют метод,
.get()
который принимает параметр по умолчанию (сам по умолчаниюNone
), так что онkwargs.get("errormessage")
возвращает значение, если этот ключ существует, и вNone
противном случае (аналогично томуkwargs.get("errormessage", 17)
, что вы могли подумать). Если вас не волнует разница между существующим ключом и имеющимсяNone
в качестве значения или несуществующим ключом, это может быть удобно.источник
kwargs.get("errormessage", 17)
может вернуть свое значение или17
если сообщение об ошибке не существует, но я не уверен. Это правильно?Ответы DSM и Tadeck напрямую отвечают на ваш вопрос.
В своих скриптах я часто использую удобные
dict.pop()
для работы с необязательными и дополнительными аргументами. Вот пример простойprint()
оболочки:Затем:
Как видите, если
prefix
не содержится вkwargs
, то значение по умолчанию''
(пустая строка) сохраняется в локальнойprefix
переменной. Если он указан, то используется его значение.Как правило, это компактный и читаемый рецепт для написания оболочек для любого типа функции: всегда просто передавайте аргументы, которые вы не понимаете и даже не знаете, существуют ли они. Если вы всегда проходите
*args
и**kwargs
делаете свой код медленнее и требует немного большего набора текста, но если интерфейсы вызываемой функции (в данном случаеprint
) изменяются, вам не нужно менять свой код. Такой подход сокращает время разработки, поддерживая все изменения интерфейса.источник
prefix
.Это просто:
Вам нужно проверить, есть ли ключ в словаре. Синтаксис для этого:
some_key in some_dict
(гдеsome_key
что-то хешируемое, не обязательно строка).Идеи, которые вы связали ( эти идеи ), содержат примеры для проверки наличия определенного ключа в словарях, возвращаемых
locals()
иglobals()
. Ваш пример аналогичен, потому что вы проверяете наличие определенного ключа вkwargs
словаре (словарь, содержащий аргументы ключевого слова).источник
Один из способов - добавить его самостоятельно! Как? Путем слияния
kwargs
с кучей значений по умолчанию. Это не всегда подходит, например, если ключи вам заранее не известны. Однако, если они есть, вот простой пример:Значения по умолчанию устанавливаются в словаре
args
, который включает все ожидаемые нами ключи. Сначала мы проверяем, есть ли в kwargs какие-либо неожиданные ключи. Затем мы обновляемargs
сkwargs
которой будет перезаписывать новые значения , которые пользователь установил. Нам не нужно проверять, существует ли ключ, теперь мы используемargs
словарь аргументов и больше не нуждаемся в немkwargs
.источник
Вы можете легко обнаружить эти вещи самостоятельно:
источник
in
оператор сам по себе непросто, если вы никогда не программировали и / или новичок в Python. На это только намекаютdict.get()
иdict.setdefault()
помогают.источник