我需要在运行时为方法生成代码。能够运行任意代码并拥有docstring是很重要的。
我想出了一个结合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将允许您在函数中声明一个函数,因此不必进行
exec
技巧。如果希望有多个版本的函数,可以将所有这些放在一个循环中,并在
setattr
函数中更改它们的名称:(我知道这不是很好的代码,但它能说明问题)。至于设置docstring,我知道这是可能的,但我必须在文档中查找它。
编辑:可以通过
dynamo.__doc__
设置docstring,这样就可以在循环体中执行类似的操作:另一次编辑:在@eliben和@bobince的帮助下,应该解决关闭问题。
函数docstrings和名称是可变属性。你可以在内部函数中做任何你想做的事情,甚至可以有makedynamo()选择的内部函数的多个版本。不需要用字符串构建任何代码。
以下是解释器中的一个片段:
基于Theran的代码,但将其扩展到类上的方法:
应打印:
相关问题 更多 >
编程相关推荐