python - 是否可以更改类实例的方法类型注释?
问题描述
我有一个接受一些参数的类,它有一个接受并返回一个命名元组的方法。namedtuple 本身是根据一些输入在init中定义的,例如:
class MyClass:
def __init__(self, input_fields: List[str], output_fields: List[str]):
self.input_spec = namedtuple("MyClassInputs", input_fields)
self.output_spec = namedtuple("MyClassOutputs", output_fields)
def my_method(self, inputs):
# do stuff
return outputs
我想做这样的事情:
class MyClass:
def __init__(self, input_fields, output_fields):
self.input_spec = namedtuple("MyClassInputs", input_fields)
self.output_spec = namedtuple("MyClassOutputs", output_fields)
register_type_hints(self.my_method, self.input_spec, self.output_spec)
def my_method(self, inputs):
# do stuff
return outputs
def register_type_hints(method, input_spec, output_spec):
signature = inspect.signature(method)
new_parameter = signature.parameters["inputs"].replace(annotation=input_spec)
new_signature = signature.replace(
parameters=[new_parameter], return_annotation=output_spec
)
method.__signature__ = new_signature
method.__annotations__ = {"inputs": input_spec, "return": output_spec}
结果是该方法现在具有类型提示:
def my_method(self, inputs: MyClassInputs) -> MyClassOutputs:
# do stuff
return outputs
register_type_hints
如果这是一个函数,它似乎会起作用,但对于实例方法,它不喜欢它。
解决方案
推荐阅读
- fft - 使用 fft 的二阶导数
- android-viewpager - ViewPager2 迁移后出现无效 ID 0x00000001 错误
- go - 如何添加两个curve25519点
- flutter - 如何在电话身份验证期间删除移动设备中的 reCaptcha 屏幕?
- google-apps-script - Gmail 插件 - 将邮件错误地视为 - “不能使用垃圾邮件和可疑邮件”
- java - Spring Cloud 配置服务器启动失败
- python-3.x - 如何将数据框中的列替换为函数的结果
- reactjs - 什么可能导致 React Native 组件不断地卸载和重新安装?
- android - 信号 11 (SIGSEGV),代码 2 (SEGV_ACCERR)
- c++ - 在 Visual Studio 2019 上看不到 c/c+