Python2と3の「dir」の違い

トリップフック

次のコードは、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は当然の選択ですが、私のコードで問題になることが判明した関数は含まれていません。

kdopen

dirPython 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]

編集
0

コメントを追加

0

関連記事

分類Dev

Popen:Python2と3の違い

分類Dev

Python3とPython2のtype()とhasattr()の違い

分類Dev

python2 / 3のinput()の違い

分類Dev

Python2とPython3のtype()関数の違い

分類Dev

Python2とPython3のzip()関数の違い

分類Dev

Python2とPython3のread()の違い

分類Dev

utf-8のpython2と3の違い

分類Dev

Python2と3の正規表現の違い

分類Dev

Python3とPython2の違い-socket.senddata

分類Dev

「翻訳」に関するPython2と3の違い

分類Dev

Python2とPython3でのpandas.Series演算子/ =の動作の違い

分類Dev

Python2とPython3のフィルター動作の違い

分類Dev

uuidのハッシュにおけるPython2と3の違い

分類Dev

print(dir())とdir()の違い

分類Dev

/ dirと/ dir /の違い

分類Dev

Python2とPython3-3つの引数を持つマップの動作の違いは?

分類Dev

Python2のwithとifの違いは何ですか?

分類Dev

特定のシードを使用したシャッフルのPython2と3の違い

分類Dev

python3とpython2で配布パッケージを構築することの違いは?

分類Dev

Pythonのdir(…)とvars(…).keys()の違いは?

分類Dev

Python3とPython2のConfigParser

分類Dev

Python2とPython3-JSONの解析

分類Dev

Python2とPython3の正しい処理

分類Dev

Python2のdict.items()とdict.iteritems()の違いは何ですか?

分類Dev

Python2のdict.items()とdict.iteritems()の違いは何ですか?

分類Dev

Python2: '\ r'エスケープ文字を使用したprintとprint()の違い

分類Dev

バイトの追加とシリアルポートへの送信に関するpython2とpython3の違い

分類Dev

相互互換性のあるPython2 / 3の作成:__ future __、six、future.utilsの違いは?

分類Dev

Pythonのdirと__dict__の最大の違いは何ですか

Related 関連記事

  1. 1

    Popen:Python2と3の違い

  2. 2

    Python3とPython2のtype()とhasattr()の違い

  3. 3

    python2 / 3のinput()の違い

  4. 4

    Python2とPython3のtype()関数の違い

  5. 5

    Python2とPython3のzip()関数の違い

  6. 6

    Python2とPython3のread()の違い

  7. 7

    utf-8のpython2と3の違い

  8. 8

    Python2と3の正規表現の違い

  9. 9

    Python3とPython2の違い-socket.senddata

  10. 10

    「翻訳」に関するPython2と3の違い

  11. 11

    Python2とPython3でのpandas.Series演算子/ =の動作の違い

  12. 12

    Python2とPython3のフィルター動作の違い

  13. 13

    uuidのハッシュにおけるPython2と3の違い

  14. 14

    print(dir())とdir()の違い

  15. 15

    / dirと/ dir /の違い

  16. 16

    Python2とPython3-3つの引数を持つマップの動作の違いは?

  17. 17

    Python2のwithとifの違いは何ですか?

  18. 18

    特定のシードを使用したシャッフルのPython2と3の違い

  19. 19

    python3とpython2で配布パッケージを構築することの違いは?

  20. 20

    Pythonのdir(…)とvars(…).keys()の違いは?

  21. 21

    Python3とPython2のConfigParser

  22. 22

    Python2とPython3-JSONの解析

  23. 23

    Python2とPython3の正しい処理

  24. 24

    Python2のdict.items()とdict.iteritems()の違いは何ですか?

  25. 25

    Python2のdict.items()とdict.iteritems()の違いは何ですか?

  26. 26

    Python2: '\ r'エスケープ文字を使用したprintとprint()の違い

  27. 27

    バイトの追加とシリアルポートへの送信に関するpython2とpython3の違い

  28. 28

    相互互換性のあるPython2 / 3の作成:__ future __、six、future.utilsの違いは?

  29. 29

    Pythonのdirと__dict__の最大の違いは何ですか

ホットタグ

アーカイブ