首页 > 解决方案 > 是否可以更改类实例的方法类型注释?

问题描述

我有一个接受一些参数的类,它有一个接受并返回一个命名元组的方法。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如果这是一个函数,它似乎会起作用,但对于实例方法,它不喜欢它。

标签: pythonannotationsmetaprogramming

解决方案


推荐阅读