如何忽略Python对象中未定义的属性?

时间:2012-03-14 12:36:31

标签: python dictionary

我有一个Python字典,用于标记属性的键名。与此字典关联的程序设置为仅包含一些项目,并且仅在必要时才设置。因此,并非字典中的所有属性都在此脚本的每次传递中定义。

这是带字典的代码

def getWidths(self,sheetName):
    sheets = {
        'dclabels':self.dclabels,
        'tdclabels':self.tdclabels
    }

    sheetName = sheetName.lower()
    if sheetName in sheets: 
        return sheets.get(sheetName) 
    else:
        return self.colWidths

我收到错误消息AttributError: ClassName instance has no attribute 'dclabels' 我怎样才能避免这个错误?有没有办法让脚本忽略任何未定义的属性?谢谢!

我找到了解决问题的方法。

   def getWidths(self,sheetName):
       if hasattr(self, sheetName.lower()):
           name = getattr(self,sheetName.lower())
           self.name = name
           return self.name
       else:
           return self.colWidths

我利用hasattr()getattr()解决了我的问题。感谢大家的建议。

3 个答案:

答案 0 :(得分:5)

是的,你可以查询你的对象,并迭代地构建dict:

for prop in ('dclabels', 'tdclabels'):
    try:
        sheets[prop] = getattr(self, prop)
    except AttributeError: pass # expected

(样式注释:PEP8样式永远不会将代码放在冒号后的行上;我发现将单个语句的套件放在与冒号相同的行上更具可读性,只要所有代码和任何相关注释都很短。)

答案 1 :(得分:3)

你可以这样做:

sheets = { }
attr = getattr(self, "dclabels", None)
if attr is not None:
    sheets["dclabels"] = attr

或者像这样:

try:
    sheets["dclabels"] = self.dclabels
except AttributeError:
    pass

答案 2 :(得分:0)

你必须在使用它之前声明变量:

class ClassName(object):
    __init__(self,dclabels=None, tdlabels=None):
         self.dclabels = dclabels
         self.tdlabels = tdlabels