通过名称将函数的文档字符串复制到另一个函数

问题描述 投票:0回答:2

我正在寻找按名称(使用装饰器)在同一文件中复制函数的文档字符串。

我可以很容易地使用当前模块之外的函数来做到这一点,但是当涉及到同一个模块(或者更具体地说是同一个类)时我有点困惑

这是我目前所拥有的:

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__)

有什么有趣的点子吗?

python docstring
2个回答
8
投票

经过一些测试,我知道你可以这样做:

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

0
投票

这里是 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
具有相同的签名。

© www.soinside.com 2019 - 2024. All rights reserved.