使用locals迭代对象名时获取KeyError()

时间:2012-08-08 10:27:57

标签: python locals

我有5个对象,mac5_le()mac4_le等等。我试图从每个对象中提取一些值,如下所示,

for i in range(5,-1,-1):
     m = locals()['self.mac'+str(i)+'_le.text()']
     print m

我收到的错误为KeyError: 'self.mac5_le.text()'.

任何想法?

3 个答案:

答案 0 :(得分:3)

不确定为什么你会想要围绕这种方式移动对象,但你的语法肯定是错的:

locals()['self.mac'+str(i)+'_le'].text()

应该“有效”。

答案 1 :(得分:3)

什么是什么?

m = getattr(self, 'mac%d_le' % i).text()

答案 2 :(得分:0)

我看到你正在尝试的东西有些不对劲。首先,self.name变量不是本地范围。它们既可以是实例的一部分,也可以是类的一部分。本地是可从当前函数范围访问的变量,但不是全局范围。例如,在下面的代码中,您会看到foobar,但不会看到baz

baz = 1

def silly():
    # These two variables are local
    foo = 2
    bar = 3
    print locals()

致电silly()

>>> silly()
{'foo': 2, 'bar': 3}

其次,locals()globals()词典不解析点运算符,也不会调用函数。

你想要做的是使用像getattr这样的东西,或者创建一个更适合你的api(你要编写的代码不是非常惯用的Python)。以下是使用getattr的内容:

for i in range(5,-1,-1):
    m = getattr(self, 'mac'+str(i)+'_le').text()
    print m

getattr会在引擎盖下进行所有正确的查找,以找到macN_le。一旦你有了对象的引用,你就可以在它上面调用.text()

希望有所帮助!