【问题标题】:For loop and Storing variablesFor 循环和存储变量
【发布时间】:2014-07-28 20:48:00
【问题描述】:

我有一长串 if 语句检查对象(自身)是否包含一系列可选属性。

举个例子:

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]

【问题讨论】:

  • 应该是hasattr 而不是hasAttr
  • 答案是肯定的,你可以在这里做点什么,但在你做之前,先看看nedbatchelder.com/blog/201112/…
  • 我会将这些值存储在一个列表中。你想要做的有点奇怪。
  • 你为什么要这个?为什么不直接使用属性呢?
  • @Xivilai:如果您尝试动态查找属性,它们可能不是对象的真正属性,而是字典的成员,因此您应该以这种方式使用它们。 (我说“可能”是因为在某些情况下,90% 的代码想要将它们视为静态属性,而另外 10% 的代码想要将它们视为动态属性,反之亦然;它们是非常罕见的情况,但它们确实存在。)

标签: python loops for-loop hasattr


【解决方案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

正如其他人在 cmets 中所建议的那样,您似乎使用了一个奇怪的构造。在你的代码工作之后,我建议你把它交给CodeReview 并询问更好的方法来实现你想要做的事情。如果没有看到您的其余代码,很难判断,但我怀疑有更好的方法来实现您的总体目标。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2013-05-13
      相关资源
      最近更新 更多