我正在寻找按名称(使用装饰器)在同一文件中复制函数的文档字符串。
我可以很容易地使用当前模块之外的函数来做到这一点,但是当涉及到同一个模块(或者更具体地说是同一个类)时我有点困惑
这是我目前所拥有的:
import inspect
def copy_doc(func_name: str):
def wrapper(func):
doc = ... # get doc from function that has the name as func_name
func.__doc__ = doc
return func
retun wrapper
我正在寻找可以完成其中两个示例的东西:
例1:
def this() -> None:
"""Fun doc string"""
return
@copy_doc('this')
def that() -> None:
return
print(that.__doc__)
例2:
class This:
def foo(self) -> None:
"""Fun doc string"""
return None
@copy_doc('foo')
def bar(self) -> None:
return None
print(This().bar.__doc__)
有什么有趣的点子吗?
经过一些测试,我知道你可以这样做:
from typing import Callable
def copy_doc(copy_func: Callable) -> Callable:
"""Use Example: copy_doc(self.copy_func)(self.func) or used as deco"""
def wrapper(func: Callable) -> Callable:
func.__doc__ = copy_func.__doc__
return func
return wrapper
class Test:
def foo(self) -> None:
"""Woa"""
...
@copy_doc(foo)
def this(self) -> None:
...
print(Test().this.__doc__)
# Outputs:
> Woa
这里是 Iced Chai 的答案的扩展,它也将复制函数签名:
from typing import Callable, TypeVar, ParamSpec
P = ParamSpec("P")
T = TypeVar("T")
def wraps(wrapper: Callable[P, T]):
"""An implementation of functools.wraps."""
def decorator(func: Callable) -> Callable[P, T]:
func.__doc__ = wrapper.__doc__
return func
return decorator
用法示例
def func(x: int, y: int) -> str:
"""I have a docstring and arguments"""
@wraps(func)
def anotherfunc(*args, **kwargs):
return func(*args, **kwargs)
您的 IDE 智能感知/自动完成功能应该在键入
func
时建议/预览 anotherfunc()
的签名和文档字符串。我在 VSCode 上对此进行了测试,它对我有用。我经常使用这种方法而不是导入 functools.wraps
因为 functools.wraps
似乎没有复制 VSCode 智能感知的函数签名。
在 VSCode 上,当我键入
anotherfunc()
智能感知弹出显示
(x: int, y: int) -> str
-------------------------
I have a docstring
Callable[P, T]
本质上意味着“接受 P 参数并返回类型 T 的函数”。在这里,我们键入提示 wrapper
的 wraps
参数和 decorator
的返回类型与 Callable[P, T]
。这告诉编辑器的静态类型检查器,装饰的结果函数与 wraps
函数的输入参数具有相同的签名。
更具体地说,使用上面的示例,我们说装饰
anotherfunc
的结果函数的签名与 func
具有相同的签名。