检测self.rowdict存在性触发AttributeError,该如何正确检测?
解决方案
问题根源
你遇到的AttributeError不是因为rowdict是None,而是这个属性在GML32Parser实例中根本没有被定义。直接访问self.rowdict时,Python找不到该属性就会抛出错误,不管你是直接判断还是和None比较。
可行方案
方案1:用hasattr()先检测属性是否存在
先判断实例是否拥有该属性,再判断属性值是否非空,避免直接访问不存在的属性:
if hasattr(self, 'rowdict') and self.rowdict is not None: logger("self.rowdict = " + str(self.rowdict))
方案2:提前在类的初始化方法中定义属性
在GML32Parser类的__init__方法里,提前把rowdict初始化为None,后续访问时就不会触发属性不存在的错误:
class GML32Parser(HTMLParser): def __init__(self): super(GML32Parser, self).__init__() self.rowdict = None # 提前初始化属性 # 其他初始化代码...
之后就可以正常使用if self.rowdict is not None:进行判断。
方案3:用try-except捕获异常
如果无法提前初始化属性,也可以通过异常捕获处理属性不存在的情况:
try: if self.rowdict is not None: logger("self.rowdict = " + str(self.rowdict)) except AttributeError: # 这里可以写属性不存在时的处理逻辑,比如跳过或者初始化 pass
内容的提问来源于stack exchange,提问作者Lochie
相关产品推荐
相关产品推荐

