Для цикла и хранения переменных

У меня есть длинный список операторов 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).

Другие вопросы по тегам