-1

我正在尝试从字典中实例化一个类。在类构造函数中,如果没有给出,我会为某些类成员分配默认值:

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

我正在实例化的 dict 具有与我的班级成员同名的键。我像这样从 dict 实例化:

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"]

但这似乎是矫枉过正。有更好的办法吗?

4

1 回答 1

5

您可以使用**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):

任何其他关键字参数都超出continentcountry最终以kw这种方式出现在字典中。您可以使用它来支持任意参数,或者忽略传入的其他关键字参数而不抛出异常。

于 2013-10-12T13:23:20.493 回答