Как проверить, существует ли ключ в ** kwargs?

Python 3.2.3. Были некоторые идеи перечисленные здесь, которые работают на регулярных var, но кажется ** kwargs играют по разным правилам... так почему это не работает и как можно Я проверяю, существует ли ключ в ** kwargs?

if kwargs['errormessage']:
    print("It exists")

Я также думаю, что это должно работать, но это не так -

if errormessage in kwargs:
    print("yeah it here")

Я угадываю, потому что kwargs истребитель? Нужно ли мне проходить через нее, чтобы проверить, есть ли какой-то конкретный ключ?

+90
источник поделиться
6 ответов

Ты хочешь

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 в качестве значения или несуществующим ключом, это может быть удобно.

+132
источник

Ответы 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), вам не нужно менять свой код. Этот подход уменьшает время разработки, поддерживая все изменения интерфейса.

+19
источник

Это просто:

if 'errormessage' in kwargs:
    print("yeah it here")

Вам нужно проверить, находится ли ключ в словаре. Синтаксис для этого - some_key in some_dict (где some_key - это что-то хешируемое, не обязательно строка).

Идеи, которые вы связали (эти идеи), содержали примеры проверки того, существовал ли определенный ключ в словарях, возвращаемых locals() и globals(). Ваш пример аналогичен, потому что вы проверяете наличие определенного ключа в словаре kwargs (словарь, содержащий ключевые слова).

+10
источник

Один из способов - добавить его самостоятельно! Как? Путем слияния 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.

+2
источник

Вы можете легко найти эти вещи сами:

def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")
+1
источник
if kwarg.__len__() != 0:
    print(kwarg)
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос