Pypy特定错误

时间:2012-12-14 21:21:57

标签: python pypy

我有以下代码:

#!/usr/bin/env python
#!/usr/bin/env pypy

class my_components(object):
    COMP0 = 0
    COMP1 = 1
    COMP1 = 2
    __IGNORECOMP = -1

def attribute_dictionary(o):
    d = { }
    for attr in dir(o):
        if attr[:2] != '__':
            print o,attr
            d[attr] = o.__getattribute__(o, attr)
    return d

def main():
    print attribute_dictionary(my_components)

if __name__ == '__main__':
    main()

我用它来有效地在python中进行奇特的枚举。

它在python中很好用,打印:

<class '__main__.my_components'> COMP0
<class '__main__.my_components'> COMP1
<class '__main__.my_components'> _my_components__IGNORECOMP
{'COMP0': 0, 'COMP1': 2, '_my_components__IGNORECOMP': -1}

然而,当我用pypy运行它(切换前两行)时,它失败了:

<class '__main__.my_components'> COMP0
Traceback (most recent call last):
  File "app_main.py", line 53, in run_toplevel
  File "./pypy_Test.py", line 25, in <module>
    main()
  File "./pypy_Test.py", line 21, in main
    print attribute_dictionary(my_components)
  File "./pypy_Test.py", line 17, in attribute_dictionary
    d[attr] = o.__getattribute__(o, attr)
TypeError: unbound method __getattribute__() must be called with my_components instance as first argument (got type instance instead)

任何见解都是最受欢迎的。

-Thanks

2 个答案:

答案 0 :(得分:4)

您正在调用__getattribute__传递,而不是该类的实例。来自__getattribute__ documentation

  

无条件调用以实现类的实例的属性访问。

这一点在cPython中作为第一个参数的类完全可行是一个快乐的巧合;正式来说,第一个参数应该是一个实例。

答案 1 :(得分:2)

  

TypeError:必须使用调用未绑定方法__getattribute__()   my_components实例作为第一个参数(取而代之的是类型实例)

这就是说(至少对于PyPy),__getattribute__的第一个参数必须是类my_components的一个实例。

相反,o本身就是类my_components,而不是实例。

尝试更改

d[attr] = o.__getattribute__(o, attr)

d[attr] = getattr(o, attr)