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



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



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


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



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


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

723   5  

5 ответов:

вы хотите

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 " - это имя a переменная, вы получите NameError.

я должен упомянуть, что словари также имеют метод .get(), которая принимает параметр по умолчанию (сам по умолчанию None), так что kwargs.get("errormessage") возвращает значение, если ключ существует и None в противном случае (аналогично kwargs.get("errormessage", 17) что вы думаете он делает). Когда вы не заботитесь о разнице между ключом, существующим и имеющим None как ценность или ключ не существует, это может быть удобно.

ДСМ и Тадек ответ на ваш вопрос.

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

это так:

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

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

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

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

вы можете легко обнаружить эти вещи самостоятельно:

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

hello(what="world")

Comments

    Ничего не найдено.