Как проверить, существует ли ключ в ** kwargs?
Python 3.2.3. Были некоторые идеи перечисленные здесь, которые работают на регулярных var, но кажется ** kwargs играют по разным правилам... так почему это не работает и как можно Я проверяю, существует ли ключ в ** kwargs?
if kwargs['errormessage']:
print("It exists")
Я также думаю, что это должно работать, но это не так -
if errormessage in kwargs:
print("yeah it here")
Я угадываю, потому что kwargs истребитель? Нужно ли мне проходить через нее, чтобы проверить, есть ли какой-то конкретный ключ?
Ответы
Ответ 1
Ты хочешь
if 'errormessage' in kwargs:
print("found it")
Чтобы получить значение errormessage
if 'errormessage' in kwargs:
print("errormessage equals " + kwargs.get("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
в качестве значения или несуществующим ключом, это может быть удобно.
Ответ 2
Ответы DSM и Tadeck отвечают на ваш вопрос напрямую.
В моих сценариях я часто использую удобный dict.pop()
для обработки необязательных и дополнительных аргументов. Вот пример простой обертки print()
:
def my_print(*args, **kwargs):
prefix = kwargs.pop('prefix', '')
print(prefix, *args, **kwargs)
Тогда:
>>> my_print('eggs')
eggs
>>> my_print('eggs', prefix='spam')
spam eggs
Как вы можете видеть, если prefix
не содержится в kwargs
, тогда по умолчанию ''
(пустая строка) сохраняется в локальной переменной prefix
. Если он задан, тогда используется его значение.
Это, как правило, компактный и читаемый рецепт для написания оберток для любой функции: всегда просто передаваемые аргументы, которые вы не понимаете, и даже не знаете, существуют ли они. Если вы всегда проходите через *args
и **kwargs
, вы делаете свой код медленнее и требует немного более типизации, но если изменяется интерфейс вызываемой функции (в данном случае print
), вам не нужно менять свой код. Этот подход уменьшает время разработки, поддерживая все изменения интерфейса.
Ответ 3
Это просто:
if 'errormessage' in kwargs:
print("yeah it here")
Вам нужно проверить, находится ли ключ в словаре. Синтаксис для этого - some_key in some_dict
(где some_key
- это что-то хешируемое, не обязательно строка).
Идеи, которые вы связали (эти идеи), содержали примеры проверки того, существовал ли определенный ключ в словарях, возвращаемых locals()
и globals()
. Ваш пример аналогичен, потому что вы проверяете наличие определенного ключа в словаре kwargs
(словарь, содержащий ключевые слова).
Ответ 4
Один из способов - добавить его самостоятельно! Как? Путем слияния kwargs
с кучей значений по умолчанию. Это не будет уместно во всех случаях, например, если ключи не известны вам заранее. Однако, если они есть, вот простой пример:
import sys
def myfunc(**kwargs):
args = {'country':'England','town':'London',
'currency':'Pound', 'language':'English'}
diff = set(kwargs.keys()) - set(args.keys())
if diff:
print("Invalid args:",tuple(diff),file=sys.stderr)
return
args.update(kwargs)
print(args)
Значения по умолчанию устанавливаются в словарях args
, в которые входят все ожидаемые нами ключи. Сначала мы проверим, есть ли какие-нибудь неожиданные ключи в kwargs. Затем мы обновляем args
с помощью kwargs
которые перезаписывают любые новые значения, которые установил пользователь. Нам не нужно проверять, существует ли ключ, теперь мы используем args
качестве словаря аргументов и больше не нуждаемся в kwargs
.
Ответ 5
Вы можете легко найти эти вещи сами:
def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)
hello(what="world")
Ответ 6
if kwarg.__len__() != 0:
print(kwarg)