次のコードは、Python2とPython3で動作が異なりますが、その理由はわかりません。
class Dataset(object):
def __getattr__(self, item):
if not item in dir(self):
print(item)
a = Dataset()
a.Hello
Python 3での結果:
> Hello
Python 2での結果:
__members__
__members__
__methods__
...
再帰の上限に達するまで無限に。「dir」の動作の違いは何ですか?
編集:そして回避策はありますか?自己。dictは当然の選択ですが、私のコードで問題になることが判明した関数は含まれていません。
dir
Python 2.7と3.5のドキュメントは同じように見えますが、実装の詳細はありません。しかし、明らかにdir()
、Python 2では、呼び出し__getattr__
によって無限再帰が発生します。
ただし、両方のドキュメントセットには次のように記載されています
dir()は主に対話型プロンプトでの使用に便利なものとして提供されるため、厳密にまたは一貫して定義された名前のセットを提供するよりも、興味深い名前のセットを提供しようとします。その詳細な動作はリリースによって異なる場合があります。たとえば、引数がクラスの場合、メタクラス属性は結果リストに含まれません。
それが便利であることについてのそのメモは重要です。
を使用__getattr__
するself.__dict__
代わりに見るように変更するとdir()
、問題は解決します。
In [5]: class Dataset(object):
def __getattr__(self, item):
if not item in self.__dict__:
print(item)
...:
In [6]: a = Dataset()
In [7]: a.Hello
Hello
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加