如何获取被Lambda表达式包装的函数的__doc__文档字符串
获取Lambda包装函数的文档字符串
你遇到的问题很典型——lambda表达式本身没有自己的文档字符串,而且它只是直接调用原函数,没办法直接关联到原函数的__doc__属性。不过我们可以换个思路,用functools.partial来替代lambda,这样就能轻松获取到原函数的文档字符串了。
问题重现
先看你给出的示例代码,用lambda的时候确实拿不到原函数的docstring:
def foo(a=1): """Foo docstring""" return a dct = { "a": foo, "b": lambda: foo(2), } for k, v in dct.items(): print(k, v(), v.__doc__)
输出结果:
a 1 Foo docstring b 2 None
解决方案:使用functools.partial
partial会创建一个可调用对象,它保存了原函数以及预设的参数,而且可以通过func属性访问到原函数,这样就能获取到原函数的文档字符串了。
修改后的代码如下:
from functools import partial def foo(a=1): """Foo docstring""" return a dct = { "a": foo, "b": partial(foo, 2), } for k, v in dct.items(): if hasattr(v, "func"): print(k, v(), v.func.__doc__) else: print(k, v(), v.__doc__)
运行后的输出:
a 1 Foo docstring b 2 Foo docstring
为什么这个方法可行?
partial对象本质上是对原函数的包装,它会保留原函数的引用(存在func属性里)- 调用
partial对象和直接调用原函数传参的效果完全一致 - 通过检查
func属性,我们可以统一处理普通函数和partial包装后的函数,确保都能拿到正确的文档字符串
内容的提问来源于stack exchange,提问作者yellowhat
相关产品推荐
相关产品推荐

