Як перевірити, чи існує ключ у ** kwargs?


111

Пітон 3.2.3. Тут були перераховані деякі ідеї , які працюють на звичайних варах, але, здається, ** kwargs грають за різними правилами ... так чому це не працює і як я можу перевірити, чи існує ключ у ** kwargs?

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

Я також думаю, що це має працювати, але це не так -

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

Я здогадуюсь, тому що кварги - це нестерпно? Чи потрібно повторювати це, щоб перевірити, чи є в ньому певний ключ?


4
Спеціальних правил немає. Ви просто забули цитати.
Леннарт Регебро

Відповіді:


164

Ти хочеш

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

Щоб отримати значення errormessage

if 'errormessage' in kwargs:
    print("errormessage equals " + kwargs.get("errormessage"))

Таким чином, kwargsце просто інше dict. Ваш перший приклад, if kwargs['errormessage']означає "отримати значення, пов'язане з ключем" повідомлення про помилки "в kwargs, а потім перевірити його значення bool". Тож якщо немає такого ключа, ви отримаєте KeyError.

Ваш другий приклад, if errormessage in kwargs:означає "якщо kwargsмістить елемент, названий" errormessage", і якщо" errormessage"не є ім'ям змінної, ви отримаєте NameError.

Я мушу зазначити, що в словниках також є метод, .get()який приймає параметр за замовчуванням (сам за замовчуванням None), так що kwargs.get("errormessage")повертає значення, якщо цей ключ існує, і в Noneіншому випадку (аналогічно тому kwargs.get("errormessage", 17), що ви думаєте, що він робить). Якщо вам не байдужа різниця між наявним ключем і тим None, що має значення або ключ, не існує, це може бути корисно.


Дякуємо за додаткове пояснення! Завжди добре, щоб новачки python отримували додаткову інформацію та подальші приклади того, що можливо, а що ні. У цьому дусі: я думаю, kwargs.get("errormessage", 17)може повернути своє значення або 17якщо повідомлення про помилки не існує - але я не впевнений. Це правильно?
Honeybear

А, так, це так. Знайшов його тут . Дякую ... просто хотів бути впевненим.
Honeybear

21

Відповіді DSM та Тадека відповідають безпосередньо на ваше запитання.

У своїх сценаріях я часто використовую зручні 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) змінюються, вам не потрібно змінювати код. Цей підхід скорочує час розробки, підтримуючи всі зміни інтерфейсу.


Дякуємо, що показали, як призначити значення за замовчуванням prefix.
HBat

11

Це тільки це:

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

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

Ідеї, які ви пов’язали ( ці ідеї ), містили приклади для перевірки наявності конкретного ключа у словниках, повернених locals()та globals(). Ваш приклад подібний, оскільки ви перевіряєте наявність конкретного ключа в kwargsсловнику (словник, що містить аргументи ключових слів).


3

Один із способів - додати його самостійно! Як? Злившись 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, який включає всі очікувані нами ключі. Спочатку ми перевіряємо, чи є якісь несподівані клавіші у кваргів. Потім ми оновлюємо, за argsдопомогою kwargsяких буде замінено будь-які нові значення, які встановив користувач. Нам не потрібно перевіряти, чи існує ключ, ми зараз використовуємо argsяк наш словник аргументів і більше не потрібно kwargs.


1

Ви можете легко відкрити ці речі:

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

hello(what="world")

13
Видаліть "просто", і тоді це краща відповідь. Якби це було легко для всіх, тоді нам би не потрібен цей сайт. Пошук inоператора сам по собі непростий, якщо ви ніколи не програмували і / або не знайомі з Python. Це лише натякається на допомогу dict.get()та dict.setdefault()допомогу.
cfi

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.