-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):

を超える追加のキーワード引数は、そのように辞書continentに入れられます。これを使用して、任意の引数をサポートしたり、例外がスローされることなく渡された追加のキーワード引数を無視したりできます。countrykw

于 2013-10-12T13:23:20.493 に答える