【发布时间】:2010-10-06 17:04:16
【问题描述】:
我需要在运行时为方法生成代码。能够运行任意代码并拥有文档字符串非常重要。
我想出了一个结合exec 和setattr 的解决方案,这是一个虚拟示例:
class Viking(object):
def __init__(self):
code = '''
def dynamo(self, arg):
""" dynamo's a dynamic method!
"""
self.weight += 1
return arg * self.weight
'''
self.weight = 50
d = {}
exec code.strip() in d
setattr(self.__class__, 'dynamo', d['dynamo'])
if __name__ == "__main__":
v = Viking()
print v.dynamo(10)
print v.dynamo(10)
print v.dynamo.__doc__
是否有更好/更安全/更惯用的方法来实现相同的结果?
【问题讨论】:
-
您为什么需要它,您是否考虑过 Python 中的其他元编程工具?
-
我愿意接受建议 :-) 我需要这个来为 PLY 生成规则,它需要它们作为带有文档字符串的方法。为了自动化一些样板代码,我可以在运行时循环生成一些规则
-
你能举一个更好的例子,或者解释更多吗?您给出的示例不是很动态,因为它是一个硬编码字符串,我无法理解为什么您不能使用调度程序、多态性、元类等
-
我想生成几个这样的方法,它们的名称和文档字符串以某种“循环”的方式变化,即 10 个名为 dynamo1..10 的方法,文档字符串中也包含 dynamo1..10 "
标签: python metaprogramming exec