2012-08-25 67 views
2

问题

我要做到以下几点:设置属性编程

tmp = do_stuff(tmp2) 
if tmp != None: 
    num = tmp 

但是这些变量在我的问题被分配是变量:一个对象实例的(更好的性能):

class mycls(object): 
    def __init__(self): 
     self.__a, self._b, self.c = 2, 3, 5 
    def set_a(self, val): self.__a = val 
    def set_b(self, val): self._b = val 
    def set_c(self, val): self.c = val 
    A = property(fset = set_a) 
    B = property(fset = set_b) 
    C = property(fset = set_c) 
tmp2 = [7, 11, 13] 
inst = mycls() 
tmp = do_stuff(tmp2[0]) 
if tmp != None: inst.A = tmp 
tmp = do_stuff(tmp2[1]) 
if tmp != None: inst.B = tmp 
tmp = do_stuff(tmp2[2]) 
if tmp != None: inst.C = tmp 

显然,最后一部分看起来高度重复,在我的情况下需要应用于超过10个变量。我现在的问题是:如何压缩最后6行?在解决这个问题

自己尝试

理想我宁愿像一个解决方案:

for i in [[inst.A, 0], [inst.B, 1], [inst.C, 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: i[0] = tmp 

但是这不起作用(因为inst.X进行评估,并不能存储基本数据类型通过引用/指针)。我想出的另一种方法是使用变量名作为字符串并用inst.__dict__(例如像这样:

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: inst.__dict__[i[0]] = tmp 

但是这个计划的事实,ABC是性能挫败。

类似于LISP的宏在这里将会是一个巨大的帮助,不幸的是Python似乎不支持宏,我也不想添加依赖关系到我在线发现的Python宏库之一(我没有因为无论如何我都无法使用它们)。

我也想避免在列表中使用匿名函数,因为这可能会导致与第二个代码清单中相同的代码量。

我的最后一招解决这个问题目前是eval s,我不惜一切代价避免这个问题。

+0

为什么不使用lambda函数? –

+0

@Peter Kirby:我的目标是减少代码量,而不是将其转换为不同的形式。在我误解的情况下,请澄清。 – user1624579

+0

我误解了,对不起。但是,Martjin的回答是正确的,并且应该工作。 –

回答

6

您正在寻找setattr()

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: setattr(inst, i[0], tmp) 

引述文件:

这是getattr()对方。参数是一个对象,一个字符串和一个任意值。该字符串可以命名现有的属性或新的属性。如果该对象允许,该函数将该值分配给该属性。例如,setattr(x, 'foobar', 123)相当于x.foobar = 123

注意,由于None是在python一个单,通常是一个试验使用isis not运营它:

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp is not None: 
     setattr(inst, i[0], tmp) 

PEP 8 python styleguide阻碍复合语句;将if套件保留在它自己的行上,即使它只是一行。

+0

非常感谢。这确实有诀窍。 – user1624579

+0

考虑有关缩进的styleguide注释:在编写示例代码时,我尽量保持它尽可能短。虽然PEP 8中的陈述在程序和项目中肯定会有所帮助,但我认为这些准则不适用于最低限度的示例代码。 – user1624579

+0

那么,在一个3或4线的例子是不会有太大的可能性;我发现清晰的缩进更具可读性,并且使用示例代码来实现最大的可读性。 :-) –