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)
库是否有关于类型提示的建议,包括类型解析和类型检查?
答案 0 :(得分:1)
自Python 3.5以来,我们不仅拥有PEP 483,PEP 484,还拥有实现它的typing
module。
为了完整理解,您可能需要阅读这3个文档。但对于您的具体情况,简短的回答是,在PEP484领域,您可以通过4种方式使用自己的类型:
NewType
或如果你所寻求的是最重要的:
我自己的类型检查器可见的其他信息,但对任何符合PEP-484的类型检查器都不可见
然后第二种方法就是这样。如果你这样做:
Int32 = int
Int64 = int
x = 0 # type: Int32
y = 0 # type: Int64
然后Int32
和Int64
在PEP484领域中是相同的,但您可以通过使用社区维护{{3查看代码的AST(抽象语法树)来添加一些额外的检查。 }}。除了代码之外,该模块还会解析类型注释,因此您可以阅读使用的完全注释,从而获得x
和y
的其他类型信息。
而且,如果不可见不是第一优先,那么:
而不是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 mypy
和typed-ast
现在(2016年)处于非常活跃的发展阶段。并非一切都按预期工作,但据我所知,它们已经足够用于许多用例,而且似乎没有替代方案。