Для цикла и хранения переменных
У меня есть длинный список операторов if, которые проверяют, содержит ли объект (self) ряд необязательных атрибутов.
В качестве примера:
if(hasattr(self, variableList)):
var1 = self.var1
if(hasattr(self, "var2")):
var2 = self.var2
if(hasattr(self, "var3")):
var3 = self.var3
if(hasAttr(self, "var4")):
var4 = self.var4
Я пытался выяснить, существует ли простой способ использования цикла for, который будет использовать имена переменных из списка для проверки объекта, и существуют ли они для локального хранения их в методе, который, я думаю, потребует словарь в каким-то образом. Это плохая практика, чтобы попробовать выше? Было бы более уместно иметь более четкий список или сократить код чем-то вроде
for x in variableList:
if(hasattr(self,variableList[x]))
localvariable = variableList[x]
2 ответа
Это должно работать для вас:
var_list = ['var1', 'var2', 'var3'] # create list of variable string names
for var in var_list: # iterate over list of variable names
try:
# use exec to execute assignments, assuming attribute exists
exec('{0} = {1}'.format(var, getattr(self, var)))
except AttributeError: # catch the Exception if the attribute does not exist
exec('{0} = None'.format(var)) # set var to some default value, whatever
# is convenient for later code to check
# for and handle
Как другие предложили в комментариях, вы, кажется, используете странную конструкцию. После того, как ваш код заработает, я бы предложил перенести его в CodeReview и спросить о лучших методах для достижения того, что вы пытаетесь сделать. Трудно сказать, не видя остальной части вашего кода, но я подозреваю, что есть лучший способ достичь вашей общей цели.
Каждый объект имеет __dict__
свойство, которое хранит элементы экземпляра в словаре. Очень полезно для очень динамичных / интроспективных вещей. Например:
class c():
def __init__(self):
self.a = 1
def test(self):
print self.__dict__
>>> o = c()
>>> o.test()
печать
{'a': 1}
РЕДАКТИРОВАТЬ: getattr
это, вероятно, лучшее предложение, чем __dict__
Еще одна полезная новость заключается в том, что locals()
словарь локальных переменных, которые вы можете читать и записывать.
Например:
>>> locals()["TEST"] = 1
>>> TEST
печать
1
Исходя из этих двух фактов, вы должны быть в состоянии сделать все, что вы пытаетесь сделать. Является ли это хорошей идеей или нет, это совсем другая история.:) (Наверное, это не так. См. Комментарий @mgilson).