Python 3.6即将发布.PEP 494 - Python 3.6发布时间表提到12月底,所以我通过Python 3.6中的新功能看到他们提到了变量注释:
PEP 484引入了函数参数类型注释的标准,即类型提示.此PEP为Python添加语法以注释变量类型,包括类变量和实例变量:
Run Code Online (Sandbox Code Playgroud)primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: Dict[str, int] = {}
与函数注释一样,Python解释器不会将任何特定含义附加到变量注释,只将它们存储在
__annotations__
类或模块的特殊属性中.与静态类型语言中的变量声明相比,注释语法的目标是提供一种通过抽象语法树和__annotations__
属性为第三方工具和库指定结构化类型元数据的简便方法.
因此,根据我的阅读,它们是来自Python 3.5的类型提示的一部分,在Python 3.5中的什么是类型提示中有所描述.
我按照captain: str
和class Starship
示例,但不确定最后一个:如何primes: List[int] = []
解释?它是否定义了一个只允许整数的空列表?
我注意到python 3.5和python 3.6增加了很多关于静态类型检查的功能,所以我尝试使用以下代码(在python 3.6中,稳定版本).
from typing import List
a: List[str] = []
a.append('a')
a.append(1)
print(a)
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是,python没有给我一个错误或警告,虽然1
附加到一个list
只应该包含字符串.Pycharm
检测到类型错误并给我一个警告,但它并不明显,它没有在输出控制台中显示,我害怕有时我可能会错过它.我想要以下效果:
那可能吗?也许mypy
可以做到,但我更喜欢使用python-3.6-style类型检查(比如a: List[str]
)而不是使用的注释风格(如# type List[str]
)mypy
.而且我很好奇是否在本机python 3.6中有一个切换来实现我上面提到的两点.
该typing
模块在 Python 3.5+ 中实现类型提示。然而,这并没有强制执行,它目前似乎只是为了静态类型检查器(例如 PyCharm )的利益mypy
而存在。我希望它能成为鸭子打字的可行替代方案。
问题:有没有一种方法可以在 Python 3.7+ 中打开动态类型检查,但我在 Google 搜索中没有找到?例如,如果我定义
def greeting(name: str) -> str:
return name
Run Code Online (Sandbox Code Playgroud)
那么这应该在执行时失败:
greeting([12])
Run Code Online (Sandbox Code Playgroud)
我不介意为此检查付出时间代价,因为出于我的目的,我必须使用assert
语句手动实现它,并且类型提示更加简洁和描述性。
更新:下面的评论者指出typen包将为我动态强制执行类型提示。因此,这是一个肯定的答案,它将更新旧问题的答案,该问题的范围仅限于 Python 3.6,并且答案是否定的。我已经验证规范typen
示例是否按预期工作:
from typen import enforce_type_hints
@enforce_type_hints
def halve_integer(a: int) -> float:
return a / 2
halve_integer(5) # 2.5
halve_integer(5.0) # ParameterTypeError
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是每个函数都需要进行修饰才能获得行为,而不是有一个开关来打开所有功能。
更新 2:下面的回答还指出pydantic也解决了这个问题。这是两个正解。然而,pydantic
似乎更适合数据建模,并且对其验证装饰器有一些强烈的警告:
validate_arguments 装饰器处于beta阶段,它已在 v1.5 中临时添加到 pydantic 中。它在未来的版本中可能会发生重大变化,并且其界面直到 v2 …
python ×4
python-3.x ×4
type-hinting ×3
python-3.6 ×2
annotations ×1
duck-typing ×1
mypy ×1
python-3.5 ×1