Python AttributeError引发了

时间:2015-12-17 20:42:54

标签: python

我遇到了一个带有以下Python代码的“AttributeError”:

var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
if (isIE) {         
  $("#svg >g, #logos, #logos > g, g.text, .services-svg, .services-svg > g, #a-experience-svg-figure,#experience-a-svg-group a.paragraph.link")
     .each(function() {
                $(this).attr('transform', $(this).css('transform'));
     });
 }

在hasattr测试结果为正后,立即在delattr线上引发了AttributeError。恐慌非常罕见。我会说几百次。

可以从多个线程调用SomeFunc()。是否有可能在hasattr和delattr之间进入另一个线程,以便在第一个线程测试hasattr positive之后删除“_Some_Attribute”?

2 个答案:

答案 0 :(得分:1)

在查找对象的属性时,python首先查看self,然后查看类名称空间。因此,实例变量和类变量都通过了hasattr测试。删除属性时不是这种情况。类变量不会被删除。

class C(object):

    classvar = 'foo'

    def __init__(self):
        self.instancevar = 'bar'

c = C()
print('hasattr sees instance and class vars', hasattr(c, 'classvar'), hasattr(c, 'instancevar'))
print('delete instance is fine')
delattr(c, 'instancevar')
print('but classvar is not')
delattr(c, 'classvar')

运行时,您会收到错误

hasattr sees instance and class vars True True
delete instance is fine
but classvar is not
Traceback (most recent call last):
  File "u.py", line 13, in <module>
    delattr(c, 'classvar')
AttributeError: classvar

修改

修改后的代码,我再也无法重现了。下面我的测试用例没有错误。

class C(object):
    def test(self):
        setattr(self, '_foo', 'bar')
        if hasattr(self, '_foo'):
            delattr(self, '_foo')
C().test()
print("Test Passed")

答案 1 :(得分:0)

目前尚不清楚为什么会出现问题。您提供的代码片段不足以进行结论性分析。

然而,仍有一个解决方案!

而不是:

if hasattr(Self, "_Some_Attribute"):
    delattr(Self, "_Some_Attribute")

这样做:

try:
    delattr(Self, "_Some_Attribute")
except AttributeError:
    # here you choose what you want to do, some options:
    pass
    print 'delattr failed' if hasattr(Self, "_Some_Attribute") else 'ok'
    assert not hasattr(Self, "_Some_Attribute")

It is easier to ask for forgiveness than permission.