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