2

辞書プロトコルを実装するクラスLabelMapper(クラス) があります。boost::pythonその辞書にアクセスするための属性を使用するプロキシ クラスが必要です。__setitem__オーバーライドに関する多くの投稿を見てきまし__getitem__たが、正しく理解できないようです。

self.mapper単純なアプローチ (以下) は、呼び出しにより無限再帰につながりLabelMapperProxy.__getattr__ますself.mapper

class LabelMapper(object):
   def __init__(self): self.map={}
   def __getitem__(self,key): return self.map[key]
   def __setitem__(self,key,val): self.map[key]=val
   def __delitem__(self,key): del self.map[key]

class LabelMapperProxy(object):
   def __init__(self,mapper): self.mapper=mapper
   def __getattr__(self,key): return self.mapper[key]
   def __setattr__(self,key,val): self.mapper[key]=val
   def __delattr__(self,key): del self.mapper[key]

lm=LabelMapper()
lm['foo']=123

# construct the proxy
lmp=LabelMapperProxy(mapper=lm)
print lmp.foo                    # !!! recursion
lmp.bar=456
print lmp.bar,lm['bar']

解決策は何ですか?おそらく、標準ライブラリで事前に調理されたそのようなプロキシはありますか?

4

2 に答える 2