2012-08-08 104 views
1

我有5个对象,mac5_le(),mac4_le等等。我试图从每个如下对象的一些价值,使用locals迭代对象名称时获取KeyError()

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

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

任何想法?

+1

你可以给更多的上下文 - 你想要做什么,为什么你要用'locals()'做奇怪的事情? – dbr 2012-08-08 10:46:45

+0

亲爱的DBR,抱歉没有回复,因为我被困在其他一些循环中。我有类似名称的对象,并想通过他们的名字循环。但是它们是在父类中构造的。 ** getattr **也不起作用。请帮助。 - Manjunath Bhat – manz 2012-11-02 10:01:06

+0

m = getattr(self,'mac%d_le'%i).text()的作品。非常感谢。 – manz 2012-11-02 10:22:55

回答

3

什么是什么?

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

亲爱的伊格纳西奥·巴斯克斯 - 艾布拉姆斯,抱歉不回复,因为我被困在不同的循环中。你的答案完美无缺。非常感谢。 – manz 2012-11-02 10:20:45

3

不知道你为什么会想Munge时间围绕这样的对象,但你一定有你的语法错误:

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

应该“工作”。

+0

+1教我“munge”一词。 – ThePadawan 2012-08-08 10:45:02

+0

您好Tim Pietzcker,抱歉我没有回复,因为我陷入了其他循环。你说的答案工作正常,但在我的情况下,我玩的是父类的方法。无论如何非常感谢您的快速回复。 – manz 2012-11-02 09:47:42

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()

希望有帮助!

+0

亲爱的jszakmeister,对不起,因为我陷入了一些其他的循环。由于我使用的是父类的方法,所以** getattr **也不起作用。 :(不管怎么说,非常感谢你的快速回复。 – manz 2012-11-02 09:44:09

+0

再次语法错误。你已经提出了正确的答案。它完美的工作。非常感谢。 – manz 2012-11-02 10:19:23