Python 2和3之间"dir"的区别

tri*_*ook 9 python

以下代码在Python 2和Python 3中的行为有所不同,我不确定原因.

class Dataset(object):
    def __getattr__(self, item):
        if not item in dir(self):
            print(item)

a = Dataset()
a.Hello
Run Code Online (Sandbox Code Playgroud)

Python 3中的结果:

> Hello
Run Code Online (Sandbox Code Playgroud)

Python 2中的结果:

__members__
__members__
__methods__
...
Run Code Online (Sandbox Code Playgroud)

无限制地直到达到递归上限."dir"的行为有什么不同?

编辑:有解决方法吗?自.dict是显而易见的选择,但它不包括在我的代码中成为问题的函数.

kdo*_*pen 6

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
Run Code Online (Sandbox Code Playgroud)