2
私のスクリプトはPython3の再帰的ループに入りますが、iteritems
をitems
に置き換えようとしましたが、Python2がうまく動作しません... __getattribute__
に変更がありますか?実行するとpython2をpython3に変換するgetattribute
class Map(object):
def __init__(self, *args, **kwargs):
for arg in args:
if isinstance(arg, dict):
for k, v in arg.items():
self.__dict__[k] = v
self.__dict__['_' + k] = v
if kwargs:
for k, v in kwargs.items():
self.__dict__[k] = v
self.__dict__['_' + k] = v
def __getattribute__(self, attr):
if hasattr(self, 'get_' + attr):
return object.__getattribute__(self, 'get_' + attr)()
else:
return object.__getattribute__(self, attr)
def get(self, key):
try:
return self.__dict__.get('get_' + key)()
except (AttributeError, TypeError):
return self.__dict__.get(key)
Map(**{'hello': 'world', 'foo': 'bar'}) # infinite recursion
が、これは生産:あなたの__getattribute__
が(そのため、あなたのクラスの__getattribute__
呼び出し)getattr()
を呼び出すことによってhasattr()
the documentation状態の作品を呼び出しているので、あなたがここに無限再帰を持って
Traceback (most recent call last):
File "demo.py", line 29, in <module>
Map(**{'hello': 'world', 'foo': 'bar'}) # recursive loop
File "demo.py", line 13, in __init__
self.__dict__[k] = v
File "demo.py", line 17, in __getattribute__
if hasattr(self, 'get_' + attr):
File "demo.py", line 17, in __getattribute__
if hasattr(self, 'get_' + attr):
[...]
RecursionError: maximum recursion depth exceeded
問題を再現するテストコードを提供できますか? – cdarke
@cdarke hasattr(self、 'get_' + attr)と思われる:代わりにAttributeErrorでtry/except節を使ってPY3の問題を修正する – pietklerks