通过map builtin在Python中设置对象实例的属性

时间:2013-10-15 02:03:22

标签: python map

必须有一种方法可以使用map()

执行此操作

此:

for inst in list_of_instances:
    inst.run()

可以这样做:

map(operator.methodcaller('run'), list_of_instances)

如何使用map()完成此操作?

for inst in list_of_instances:
    inst.some_setting = True

2 个答案:

答案 0 :(得分:4)

您可以使用setattr

map(lambda inst: setattr(inst, 'some_setting', True), list_of_instances)

或使用列表理解:

[setattr(inst, 'some_setting', True) for inst in list_of_instances]

BTW,我认为简单for循环优于map,因为

  • for循环更容易阅读。
  • map,列表推导版本生成临时列表([None, None, None, ..., None]

答案 1 :(得分:2)

你可以,但这不是一个好主意。

map旨在仅用于纯(不可变)操作,即返回 new 对象的函数。缺乏itemsetter函数反映了这一观点。由于您的代码修改了对象,因此您应该使用for循环。

这很重要,因为在Python 3中,map doesn't return a list。它返回一个迭代器对象,它根据需要调用你的函数。所以在Python 3下,你的代码根本不会运行。

map vs for区别并非Python独有。在JavaScript中,您有mapforEach;在Haskell中,您有maptraverse。区分这两个根本不同的东西很重要。