Поскольку все возможные методы имеют одинаковый тип, вы можете указать этот тип статически.
<b>from typing import Callable, Optional</b>
class ABBase:
def get_processor_func(self, name: str) <b>-> Optional[Callable[[],int]]</b>:
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]