Назначьте аргументы по умолчанию для членов класса Python

Я пытаюсь создать экземпляр класса от диктата. В конструкторе класса я назначаю значения по умолчанию некоторым членам класса, если они не указаны:

class Country(object):
    def __init__(self, continent, country = "Zimbabwe"):
        # do stuff

У диктанта, из которого я создаю копию, есть ключи с тем же именем, что и у моих учеников. Я из инстанции излагаю вот так:

country = Country(
    continent = dictionary["continent"],
    country   = default_value if "country" not in dictionary else    dictionary["country"]
)

Как можно видеть, возможно, что в словаре может не быть ключа, соответствующего имени класса. В этом случае, если ключ "страна" не существует, я хотел бы оставить страну-участницу по умолчанию, то есть "Зимбабве". Есть ли элегантный способ сделать это? Нечто в виде:

country = dictionary["country"] if "country" in dictionary else pass

Это, однако, невозможно. Я знаю, что могу иметь словарь значений по умолчанию в качестве статического члена класса Country и делать это так:

country = Country.default_values["country"] if "country" not in dictionary else dictionary["country"]

Но это похоже на излишество. Есть ли лучший способ?

1 ответ

Решение

Вы можете использовать **mapping вызов синтаксиса для применения словаря в качестве аргументов ключевого слова:

Country('Africa', **dictionary)

Если в словаре есть country ключ, он будет передан __init__ метод в качестве ключевого аргумента. Если это не так, то country устанавливается в значение по умолчанию, указанное в сигнатуре метода.

Демо-версия:

>>> class Country(object):
...     def __init__(self, continent='Europe', country='Great Britain'):
...         print 'Continent: {}, Country: {}'.format(continent, country)
... 
>>> dictionary = {'continent': 'Africa', 'country': 'Zimbabwe'}
>>> Country(**dictionary)
Continent: Africa, Country: Zimbabwe
<__main__.Country object at 0x100582550>
>>> Country(**{'country': 'France'})
Continent: Europe, Country: France
<__main__.Country object at 0x100582510>

Существует зеркальный синтаксис для сигнатур функций; **mapping в списке аргументов фиксирует аргументы ключевых слов, не названные явно:

def __init__(self, continent='Europe', country='Great Britain', **kw):

Любые дополнительные аргументы за пределами ключевого слова continent а также country в конечном итоге в словаре kw сюда. Вы можете использовать его для поддержки произвольных аргументов или игнорирования дополнительных аргументов ключевых слов, передаваемых без исключений.

Другие вопросы по тегам