Как игнорировать атрибуты, которые не определены в объекте Python? - PullRequest
2 голосов
/ 14 марта 2012

У меня есть словарь 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 ]

5 голосов
/ 14 марта 2012

Да, вы можете запросить свой объект и построить итерацию итеративно:

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

(Примечание по стилю: стиль PEP8 никогда не ставит код в строку после двоеточия; я считаю более читабельным помещать набор одного оператора в ту же строку, что и двоеточие Пока весь код и любые связанные комментарии короткие.)

3 голосов
/ 14 марта 2012

Вы можете сделать это так:

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

или вот так:

try:
    sheets["dclabels"] = self.dclabels
except AttributeError:
    pass
0 голосов
/ 14 марта 2012

Вы должны объявить переменные, прежде чем использовать их следующим образом:

class ClassName(object):
    __init__(self,dclabels=None, tdlabels=None):
         self.dclabels = dclabels
         self.tdlabels = tdlabels
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...