跳到主要内容

clone_method

函数私有装饰器源码

decorator: Callable[
[Callable[Concatenate[S, P], T]],
Callable[Concatenate[S, P], T]
] = clone_method[**P, S, T](
func_o: Callable[Concatenate[P], Any],
)

class Example:
@clone_method(func_o)
def func(self, val1, val2, ...): ...

装饰器,透过克隆另一个方法的签名,来修改某方法的静态注解。

该装饰器应当用于克隆某个普通的绑定方法。它不适用于类方法、静态方法、或普通的函数。

备注

须知,该装饰器不会修改被装饰方法签名中的返回值。

备注

须知,该装饰器不会修改被装饰方法在运行时的行为。

参数

输入

参数类型必选
说明
func_o(**P) -> Any

用来提供被克隆的签名的原函数。其签名应当与一个已经绑定后的方法格式相同。

但须知该函数自身并非一个绑定方法。

输出

参数类型
说明
decorator((self: S, **P) -> T) -> ((self: S, **P) -> T)

一个包装函数。该函数直接返回被包装的函数。但所返回的被包装函数,其签名会与参数func_o一致。

签名的输入参数部分、拷贝自func_o,而输出值仍然由被包装的方法决定。

范例

将函数的签名克隆到某个方法

clone_signature_to_method.py
from typing import reveal_type
import inspect
import flask_sqlalchemy_compat as fsc


def test_func(val1: int, val2: str) -> float: ...


class Example:
@fsc.utilities.clone_method(test_func)
def modified_method(self, *args, **kwargs) -> str:
return "不是float!"


if __name__ == "__main__":
reveal_type(Example().modified_method)
print(inspect.signature(Example().modified_method))
print(Example().modified_method(1, "2"))