【发布时间】:2021-12-06 13:42:50
【问题描述】:
我想提取一个函数的文档字符串,一旦它被包裹在lambda中。
考虑以下示例:
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
如何引用在“调用”lambda 时调用的函数?
更新
感谢所有回答:
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
【问题讨论】:
-
这是一个有趣的问题。我不确定这是否可能,因为 'b' 是一个完全没有文档字符串的全新函数。我不确定您是否可以内省函数调用的函数。
-
你不能,你最好使用
functools.partial,它将包装函数保留为func属性-functools.partial(foo, 2).func.__doc__。 -
你不能。一个函数可以调用多个函数,那么 python 应该如何知道哪个“子”文档字符串是正确的呢?我能想到的最好的方法是在 lambda 上使用
functools.wraps,它将包装函数的文档字符串复制到包装函数。 -
始终可以选择“手动”将文档字符串添加到您的 lambda,例如
dct["b"].__doc__ = "Lambda docstring",但我不知道这是否适合您的实际用例。
标签: python python-3.x lambda docstring