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) | 一个包装函数。该函数直接返回被包装的函数。但所返回的被包装函数,其签名会与参数 签名的输入参数部分、拷贝自 |
范例
将函数的签名克隆到某个方法
- 代码
- 结果
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"))
Runtime type is 'method'
(val1: int, val2: str) -> str
不是float!