部分函数的类型注释

别列耶夫马克西姆

我们有多个带有 args 和 kwargs 的具有相同类型注释的类部分函数,​​例如:

def fruit(fruit_name: str, fruit_class: Type, arg1: int, arg2: float, arg3: tuple):
    pass
    
def apple(*args, **kwargs):
    return fruit("apple", *args, **kwargs)
    
def orange(*args, **kwargs):
    return fruit("orange", *args, **kwargs)
    
def banana(*args, **kwargs):
    return fruit("banana", *args, **kwargs)

我可以以某种方式为函数创建一个模板apple并将其分配给它们吗?我考虑过定义,但不清楚如何将其分配给函数orangebananaProtocol__call__

切普纳

而不是一个函数,你可以使用functools.partial

from typing import Callable, Type
from functools import partial

Fruit = ...  # whatever fruit returns
# type of fruit(), but without the initial string parameter
FruitMaker = Callable[[Type, int, float, tuple], Fruit]

def fruit(fruit_name: str, fruit_class: Type, arg1: int, arg2: float, arg3: tuple) -> Fruit:
    ...


apple: FruitMaker = partial(fruit, "apple")
orange: FruitMaker = partial(fruit, "orange")
banana: FruitMaker = partial(fruit, "banana")

另一种可能性是重构fruit以获取名称,并返回一个关闭水果名称的函数。

def fruit_maker(fruit_name: str) -> FruitMaker:
    def fruit(fruit_class: Type, arg1: int, arg2: float, arg3: tuple):
        ...
    return fruit

apple = fruit_maker("apple")
orange = fruit_maker("orange")
banana = fruit_maker("banana")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章