【问题标题】:Python typing is not getting enforcedPython类型没有得到强制执行
【发布时间】:2019-10-29 14:03:41
【问题描述】:

我正在测试 ^Python3.6 的打字功能,但它似乎什么也没做,我可以做到这一点而不会出错:

my_var: int = 0
my_var = 'str'
# no error

def ret_var(my_var: int) -> int:
    return my_var
ret_var(my_var)
# also no error

我怎样才能得到这个抛出一个异常或至少一个警告?

【问题讨论】:

  • @Georgy 我不确定,最后有一个可回答的问题不在链接的问题中,特别是如何以引发异常的方式使用注释。
  • @Andy 我可以看到在重复的目标 OP 中虽然有相同的请求:“我想要以下效果:如果很明显我使用了错误的类型,如上所示,抛出警告或错误"
  • @Georgy 你是对的,看起来我的大脑在阅读时跳过了那条线

标签: python python-3.x typing


【解决方案1】:

类型注释本身并没有做任何事情来强制类型,它们所做的只是准备您的代码以供类型检查器(例如 Mypy)评估,同时允许以编程方式读取函数注释以用于更智能的装饰器之类的东西。

如果出于某种原因你想在不使用类型检查器的情况下开始强制类型,你可以装饰你的函数。我在github 上有一个这样的装饰器,除了标准注释外,它还支持Union[]、Optional[] 和Any:

用法:

from type_enforcer import enforce_types


@enforce_types
def foo(x: int, y: float) -> int:
    return int(x * y)
>>> try:
>>>     foo(5, 2.0)
>>> except TypeError as e:
>>>     print(str(e))
10

>>> try:
>>>     foo(5, 2)
>>> except TypeError as e:
>>>     print(str(e))
Argument y supplied wrong type: expected float, got int.

【讨论】:

  • 非常感谢,这回答了我所有的问题,我只是不明白为什么 python 团队将它设计成那样。
  • 网址损坏
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 2021-11-22
  • 2021-05-16
  • 2020-06-10
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多