Как проверить, существует ли ключ в * * kwargs?
Python 3.2.3. Здесь были перечислены некоторые идеи, которые работают на обычных var, но, похоже, **кварги играют по другим правилам... так почему же это не работает и как я могу проверить, существует ли ключ в **kwargs?
if kwargs['errormessage']:
print("It exists")
Я тоже думаю, что это должно работать, но это не...
if errormessage in kwargs:
print("yeah it's here")
Я предполагаю, потому что kwargs является итерационным? Нужно ли мне перебирать его, чтобы проверить, есть ли конкретный ключ?
5 ответов:
вы хотите
if 'errormessage' in kwargs: print("found it")чтобы получить значение
errormessageif '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вы делаете свой код медленнее, и требует немного больше ввода, но если интерфейсы вызываемой функции (в этом случае
это так:
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