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

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

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

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

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

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

53
13 сент. '12 в 8:14
источник поделиться
5 ответов

Вы хотите

if 'errormessage' in kwargs:
    print("found it")

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

82
13 сент. '12 в 8:17
источник

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

11
13 сент. '12 в 12:35
источник

Это просто:

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

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

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

8
13 сент. '12 в 8:19
источник

Один из способов - добавить его самостоятельно! Как? Слияние 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
13 сент. '12 в 10:57
источник

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

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

hello(what="world")
1
13 сент. '12 в 10:24
источник

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