[英]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.