3

dictの特別なサブクラスを作成する必要があります。その中で、一連のキーのデフォルト値を設定したいと思います。

これを行うための正しい構文を見つけるのに失敗しているようです。

これが私が試していることです:

class NewDict(dict):
    Key1 = "stuff"
    Key2 = "Other stuff"
    NoList = []
    Nada = None

次に、次のようなオブジェクトをインスタンス化します。

PrefilledDict = NewDict()

そこに何かを使おうとしています:

print PrefilledDict['Key1']

しかし、私の辞書は辞書ではないようです。

私は少し欠けていますか?

4

3 に答える 3

9

あなたはそのようにあなたが望むものを達成することができます:

class NewDict(dict):

    def __init__(self):
        self['Key1'] = 'stuff'
        ...

PrefilledDict = NewDict()
print PrefilledDict['Key1']

コードを使用して、ディクショナリのキーではなく、NewDictクラスの属性を作成します。つまり、次のように属性にアクセスします。

PrefilledDict = NewDict()
print PrefilledDict.Key1
于 2012-06-05T16:26:04.797 に答える
8

サブクラス化は必要ありません:

def predefined_dict(**kwargs):
    d = {
        'key1': 'stuff',
        ...
    }
    d.update(kwargs)
    return d

new_dict = predefined_dict()
print new_dict['key1']

あるいは単に:

defaults = {'a':1, 'b':2}
new_dict = defaults.copy()
print new_dict['a']
于 2012-06-05T16:54:29.403 に答える
3

@astynaxは良い答えを提供しましたが、サブクラスを使用する必要がある場合は、次のことができます。

class defaultattrdict(dict):
    def __missing__(self, key):
        try: return getattr(self, key)
        except AttributeError:
            raise KeyError(key) #PEP409 from None

それで:

class NewDict(defaultattrdict):
    Key1 = "stuff"
    Key2 = "Other stuff"
    NoList = []
    Nada = None

PrefilledDict = NewDict()
print(PrefilledDict['Key1']) # -> "stuff"
print(PrefilledDict.get('Key1')) #NOTE: None as defaultdict

注:コードはpep8の命名規則に従っていません。

于 2012-06-05T17:19:53.890 に答える