以下代码在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是显而易见的选择,但它不包括在我的代码中成为问题的函数.
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)