PEP-484类型带有自己类型的注释

时间:2016-06-24 04:31:23

标签: python numpy types cython type-hinting

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

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

或与Numba一起使用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)

库是否有关于类型提示的建议,包括类型解析和类型检查?

1 个答案:

答案 0 :(得分:1)

自Python 3.5以来,我们不仅拥有PEP 483PEP 484,还拥有实现它的typing module

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

  1. 使用自己的类型进行注释,
  2. 创建type aliases
  3. 使用NewType
  4. 使用own generic types
  5. 如果你所寻求的是最重要的:

      

    我自己的类型检查器可见的其他信息,但对任何符合PEP-484的类型检查器都不可见

    然后第二种方法就是这样。如果你这样做:

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

    然后Int32Int64在PEP484领域中是相同的,但您可以通过使用社区维护{{3查看代码的AST(抽象语法树)来添加一些额外的检查。 }}。除了代码之外,该模块还会解析类型注释,因此您可以阅读使用的完全注释,从而获得xy的其他类型信息。

    而且,如果不可见不是第一优先,那么:

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

    • 而不是combine(Int32, Metre)我会使用typing.Union[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
    

    在上面的代码中,您可以运行社区维护的typed-ast module

    static type-checker mypytyped-ast现在(2016年)处于非常活跃的发展阶段。并非一切都按预期工作,但据我所知,它们已经足够用于许多用例,而且似乎没有替代方案。