gpt4 book ai didi

python - PEP-484 带有自己类型的类型注解

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:13 28 4
gpt4 key购买 nike

PEP-484 为类型注释提供了语义。这些非常适合 a) 文档和 b) IDE 帮助。它们不太适合代码优化。

例如,不幸的是,Cython 无法使用 PEP 484 注释 https://groups.google.com/d/msg/cython-users/DHcbk78rDec/6-b5XtCRGBEJ

或者使用 Numba,后者使用自己的注释格式,格式为字符串,如“float64(int32, int32)” http://numba.pydata.org/numba-doc/0.24.0/reference/types.html

我如何在 PEP 484 框架内使用我自己的类型工作?我明确不想破坏 PEP-484 语义,而是用附加信息扩充现有类型对我自己的类型检查器可见,但对任何符合 PEP-484 的类型检查器或 IDE 不可见。

以下内容是否会在 PEP-484 语义中解释为 List[int]?

class Int32(int): pass
x = [1] # type: List[Int32]

像这样更花哨的类型怎么样?

def combine(typeA, typeB):
class X(typeA, typeB): pass
return X

class Metre(): pass

# is y an 'int' to PEP-484 typecheckers?
y = 1 # type: combine(Int32, Metre)

对库使用类型提示有什么建议,包括类型解析和类型检查?

最佳答案

从 Python 3.5 开始,我们不仅有 PEP 483 , PEP 484 , 还有 typing module实现它。

要完整理解,您可能需要通读这 3 个文档。但对于您的具体情况,简短的回答是,在 PEP484 领域中,您可以通过 4 种方式使用自己的类型:

  1. 只需使用自己的类型进行注释,
  2. 创建type aliases ,
  3. 使用NewType , 或
  4. 使用own generic types

如果你的追求高于一切:

additional information visible to my own type checker, but invisible to any PEP-484 conforming type checker

那么第二种方法就是这样。如果你这样做:

Int32 = int
Int64 = int

x = 0 # type: Int32
y = 0 # type: Int64

然后 Int32Int64 在 PEP484 领域中将是相同的,但您可以通过查看代码的 AST(抽象语法树)来添加一些额外的检查社区维护 typed-ast module .除了代码之外,该模块还解析类型注释,因此您可以阅读所使用的精确注释,从而获得xy的一些额外类型信息>.


而且,如果隐身不是第一要务,那么:

  • 而不是 class Int32(int): pass 我宁愿做 typing.NewType('Int32', int)

  • 我会使用 typing.Union[Int32, Metre] 而不是 combine(Int32, Metre)

Int32 = typing.NewType('Int32', int)

class Metre:
pass

x = [Int32(1)] # type: List[Int32]
y = Int32(1) # type: typing.Union[Int32, Metre]

print(x[0] + 1) # ok, since Int32 is still int
y = Metre() # ok, since y can be Int32 or Metre

在上面的代码中,你可以运行社区维护的static type-checker mypy .


两者都是typed-astmypy现在(2016 年)正在非常积极的发展中。并非一切都按预期工作,但据我所知,它们已经足够好用于许多用例,而且似乎没有其他选择。

关于python - PEP-484 带有自己类型的类型注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005633/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com