用于循环和存储变量

时间:2014-07-28 20:48:00

标签: python loops for-loop hasattr

我有一长串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 个答案:

答案 0 :(得分:1)

这应该适合你:

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并询问更好的方法来实现您的目标。没有看到你的其余代码,很难说,但我怀疑有更好的方法来实现你的总体目标。

答案 1 :(得分:1)

每个对象都有一个__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的评论)。