python应用程序类型_python – 类型提示条件可变参数应用程序

我试图键入提示构造函数的部分应用程序,一旦提供“tag”实例,它就会被完全应用.这是通过包装类实现的,包装类存储构造函数和任何部分应用的参数.由于包装器适用于多种类型,因此必须采用variadic * args.

这会产生两种情况,它们所采用的参数不同:

>申请:(标签:标签,……) – > CLS

>商店:( …) – >部分[CLS]

值得注意的是,2.情况可能会或可能不会接收第一个参数.它们都是重叠的,因为它们是可变的.这很容易实现.我试图使用@overload键入提示:

from typing import TypeVar, Generic

#: the class to partially construct

Cls = TypeVar('Cls')

class Tag:

"""Instances of this class complete the partial application"""

class Partial(Generic[Cls]):

"""Partially construct ``ctor`` until a :py:class:`~.Tag` is applied"""

def __init__(self, ctor: Type[Cls], *args):

self.ctor = ctor

self.args = args

# type hints

@overload

def __call__(self, tag: Tag, *args) -> Cls:

...

@overload

def __call__(self, *args) -> 'Partial[Cls]':

...

# implementation

def __call__(self, *args):

if args and isinstance(args[0], Tag):

return self.ctor(args[0], *self.args, *args[1:])

return Partial(self.ctor, *self.args, *args)

然而,mypy和PyCharm都不满意这一点(PyCharm目前需要一个显式方法调用,但这不是我的问题).使用显式非标记扩展第二个重载(标记:Any,…) – >部分[Cls]无法解决问题.这两种工具都会报告类型不匹配,不兼容的重载,或者回退到Any或Union.

任何关于类型提示正确的帮助是值得赞赏的.

键入检查代码示例:

class VariadicString(str):

def __new__(cls, *args):

return str(args)

a = RecursivePartial(VariadicString, 1, 2, 3)

b = a(4, 5, 6)

c = b(Tag(), 7, 8, 9)

reveal_locals() # absent for PyCharm

mypy正确识别a,b和c的类型,但由于不兼容的重载重叠而拒绝该程序:

test.py:17: error: Overloaded function signatures 1 and 2 overlap with incompatible return types

test.py:38: error: Revealed local types are:

test.py:38: error: a: test.Partial[test.VariadicString*]

test.py:38: error: b: test,Partial[test.VariadicString*]

test.py:38: error: c: test.VariadicString*

PyCharm不拒绝该程序,但错误地将c标识为两种返回类型的联合:

a: Partial[VariadicString]

b: Partial[VariadicString]

c: Union[VariadicString, Partial[VariadicString]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值