繁体   English   中英

在 Python 中为动态方法调用添加类型提示

[英]Add type hinting to dynamic method call in Python

如何键入动态调用的方法?

例子:


class ABBase:
    def get_processor_func(self, name: str): # ?? How to type return ?
        func_name = f"process_{name}"
        return getattr(self, func_name, None)

    def process_all(self):
        for p in ['1', '2', '3']:
            func = self.get_processor_func(p)
            if func:
                print(func())

class ProcessA(ABBase):

    def process_1(self) -> int:
        return 111

    def process_2(self) -> int:
        return 222


class ProcessB(ABBase):

    def process_1(self) -> int:
        return 111

    def process_3(self) -> int:
        return 333


a = ProcessA()
a.process_all()
print('----')
b = ProcessB()
b.process_all()

是否可以为此构造添加类型注释? 如何键入get_processor_func方法或整个类? Python 3.8 对我来说已经足够了。

由于所有可能的方法都具有相同的类型,因此您可以静态指定该类型。

from typing import Callable, Optional


class ABBase:
    def get_processor_func(self, name: str) -> Optional[Callable[[],int]]:
        func_name = f"process_{name}"
        return getattr(self, func_name, None)

    def process_all(self):
        for p in ['1', '2', '3']:
            func = self.get_processor_func(p)
            if func:
                print(func())

Optional考虑了返回值是None的可能性,而不是适当的可调用对象。

如果签名可能会有所不同,您可以使用...而不是参数类型列表: Callable[...,int]

如果返回类型可能会有所不同,那么除了指定typing.Any之外,您无法做任何其他事情。

在最坏的情况下,参数和返回类型都可能有所不同,最好的说法是get_process_func返回一个可调用对象。

def get_processor_func(self, name: str) -> Optional[Callable]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM