1

以下は、Pythonで実装される私の要件です。プログラムのさまざまな部分から更新される context と呼ばれる辞書があります。

envここで、辞書コンテキストと環境変数辞書も保持するという obj を作成する必要があります。

envオブジェクトはディクショナリ クラスのすべての機能を備えている必要があり、オブジェクトの属性としてディクショナリの項目にアクセスできる必要があります。

例えば、

context = {'install_path' : '/home/xyz','cwd' : '/home/xyz/Desktop'}

context 辞書はプログラムのさまざまな部分から更新されます。

envここで、コンテキスト ディクショナリと環境ディクショナリを保持するオブジェクトを作成する必要があります。また、envオブジェクトの属性として辞書の項目にアクセスできる必要があります。

例えば:

print(env.install_path) # accessing item of context dictionary
print(env.os) #accessing environmental variable print(env)
print(env['install_path'])
print(env)

次のように出力を生成する必要があります。

 /home/xyz linux 
 /home/xyz
 {'install_path':'/home/xyz','cwd':'/home/xyz/Desktop'}
 all envrionmental variables

後でコンテキスト ディクショナリが更新されたときに、envオブジェクトも更新する必要があります。

これを達成する方法を助けてください。

4

3 に答える 3

2

これは私が見たようなことをする最も簡単な方法です:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

if __name__ == '__main__':
    o = AttrDict(x=10)
    o.y = 20
    o['z'] = 30
    print o.x, o['y'], o.z

出力:

10 20 30
于 2013-02-27T10:10:14.587 に答える
0

このような何かがトリックを行う必要があります:

class DictWithReference(dict):

    def __init__(self, *args, **kwargs):
        self._ref_other = kwargs.pop("ref", {})
        super(DictWithReference, self).__init__(*args, **kwargs)

    def __getattr__(self, attr):
        return self.__getitem__(attr)

    def __getitem__(self, key):
        try:
            return super(DictWithReference, self).__getitem__(attr)
        except KeyError:
            return self._ref_other[attr]

使用法:

>>> context = {'install_path' : '/home/xyz','cwd' : '/home/xyz/Desktop'}
>>> env = DictWithReference({'foo': 'bar'}, ref=context)
>>> env.foo
'bar'
>>> env['foo']
'bar'
>>> env.install_path
'/home/xyz'
>>> env['install_path']
'/home/xyz'
于 2013-02-27T08:44:11.780 に答える
0

dict のサブクラスを作成します。

オブジェクトには、属性が欠落している場合に呼び出されるメソッドがあります。これらのメソッドのデフォルトの実装をオーバーライドして、ディクショナリの取得および設定操作を行うことができます。

class AttributeDict(dict):
    def __getattr__(self, attr):
        return self[attr]
    def __setattr__(self, attr, value):
        self[attr] = value

前回の対談はこちら

既存の辞書から新しい AttributeDict を作成する必要がある場合は、次を使用できます。

context = {'install_path' : '/home/xyz','cwd' : '/home/xyz/Desktop'}
new_dict = AttributeDict(context)
print new_dict.install_path

既存の辞書を参照するだけの別のオブジェクトが必要な場合は、これを使用します

class ReferencedDict(object):
    def __init__(self, reference):
        self.ref = reference
    def __getattr__(self, value):
        return self.ref[value]

env = ReferencedDict(context)
print(env)
于 2013-02-27T06:37:12.233 に答える