2

私は現在dictから継承しているクラスをPythonで実装しましたが、実際にはそれを望んでいません。継承する主な理由は、**kwargs構文を使用してコンテンツを引数リストにコピーできるようにするためです。

Pythonは辞書に対して何らかの反復を行っていると思いますが、ドキュメントが見つかりません。

これは可能ですか?もしそうなら、どのように?

物事を明確にするためだけにサンプルをコーディングします。

   class MyThing():
       def __init__(self):
            self.dictionary = {}


   thing = MyThing()
   # code that causes thing.dictionary to be populated
   somefunc(**thing)

結果は次のようになります。

TypeError: somefunc() argument after ** must be a mapping, not instance
4

1 に答える 1

9

私は行ってPythonソースを読みました、それはkeys()__getitem__メソッドを使用しているようです

class A:
    def __init__(self, data):
        self.data = data
    def keys(self):
        return self.data.keys()
    def __getitem__(self, key):
        return self.data[key]

def f(alpha):
    print alpha

f(**A({'alpha': 2}))

不思議なことに、非dictで**を使用すると、CPythonは新しい空のdictを作成しdict.update()、オブジェクトのキーをdictにコピーするために呼び出します。

これをサブクラスとして実装するのがおそらく最善ですcollections.Mapping

class A(Mapping):
    def __init__(self, data):
        self.data = data

    def __iter__(self):
        return iter(self.data)

    def __len__(self):
        return len(self.data)

    def __getitem__(self, key):
        return self.data[key]

マッピングからの継承により、ほとんどすべてのdictメソッドがサポートされています。エラーメッセージを考えると、これはpythonのすべての実装で適格であると主張できると思います。

PyPyを試しましたが、最初のバージョンを受け入れます。

于 2012-08-20T16:31:10.043 に答える