我试图键入提示构造函数的部分应用程序,一旦提供“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]]

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

  1. python可变参数函数二阶导数公式_python中函数的可变参数

    简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...

  2. python函数可变参数_python中函数的可变参数

    知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 本节视频教程 文字教程开始: 一.[其实已经用过]可变参数 回顾系统自带的可变参数函数print #系统自带的可变参数函数 ...

  3. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  4. python参数检查类型_Python类型检查

    python参数检查类型 1.什么是类型检查? (1. What is Type Checking?) Type Checking is the programming language featur ...

  5. python函数支持哪些参数类型_Python函数的几种参数类型

    以下代码均以Python3为基础理解. 初识Python函数 大部分常见的语言如C.Java.PHP.C#.JavaScript等属于C系语言,Python不属于他们中的一员(ruby亦然).在这些语 ...

  6. pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值

    python - namedtuple和可选关键字参数的默认值 我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组. 我的班级目前看起来像这样: class Node(obje ...

  7. Java 技术篇-利用exe4j工具生成exe文件实例演示,IntelliJ IDEA将项目转化为jar包方法,运行生成后的程序弹出exe4j提示处理,生成的程序显示控制台设置方法

    Java 项目转化为 exe 可执行文件 第一章:IntelliJ IDEA 将项目转化为 jar 包 ① 设置 Artifacts ② 设置是否集成外部 jar 包 ③ 将 java 项目转化为 j ...

  8. python函数如何实现可变参数_python之函数定义可变参数(任意数量参数)

    原博文 2020-05-23 11:49 − python中函数可以定义任意数量的参数,即可变参数. 比如: def fun(*args): print args 在可变参数的名字前面加一个*号,即可 ...

  9. python if else格式_Python if else条件语句详解

    我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条.第3条--一直到最后一条语句,这称为顺序结构. 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童 ...

最新文章

  1. python操作系统-python 操作系统
  2. 设计模式之迭代子模式
  3. linux双网卡私网,linux双网卡路由配置私网专线
  4. 【大话设计模式】设计模式系统学习大合集
  5. [剑指offer]面试题第[57-2]题[JAVA][和为s的连续正数序列][数学法][滑动窗口]
  6. Go Web编程--SecureCookie实现客户端Session管理
  7. ubuntu火狐证书问题
  8. 可靠性测试设备技术含量_电气自动化控制设备的可靠性测试(1)
  9. 数据集永久下架,微软不是第一个,MIT 也不是最后一个
  10. 区块链 以太坊 验证区块
  11. 怎么查看笔记本内存条型号_查看笔记本内存条型号
  12. 太吓人了,dub编译,编译phobos
  13. 毕业了,开始新的生活!
  14. springboot下载excel模板
  15. 基于PPGiPPG的心率检测原理
  16. day14课后总结app
  17. ubuntu 16.04怎么更改文件夹里面所有子文件权限
  18. java 操作 word 表格和样式_java 处理word文档 (含图片,表格内容)
  19. Java复习笔记入门阶段06:方法
  20. 学习固不可少 回顾也别有风味

热门文章

  1. ‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
  2. Android开发之ApiCloud模块开发步骤
  3. java 父类 超类_Java超类-java.lang.object
  4. java中怎么制作单选框_java代码swing编程 制作一个单选按钮的Frame
  5. android 清空canvas部分内容_Android自定义View实现圆形头像效果
  6. ios7中让程序使用统一的status bar风格
  7. 关于 VC 执行顺序
  8. 分布式消息通信ActiveMQ原理-消费消息策略-笔记
  9. sql不替换uid的更新数据语句
  10. Run P4 without P4factory - A Simple Example In Tutorials. -2