首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以强制执行类型提示吗?

可以强制执行类型提示吗?
EN

Stack Overflow用户
提问于 2020-09-10 22:30:11
回答 2查看 5.5K关注 0票数 9

在python中使用“类型提示”符号有什么好处吗?

代码语言:javascript
复制
import sys
def parse(arg_line: int) -> str:
    print (arg_line) # passing a string, returning None

if __name__ == '__main__':
    parse(' '.join(sys.argv[1:]))

在我看来,它似乎使语法变得复杂,而没有提供任何实际的好处(在开发环境之外)。在此基础上:

  • python是否计划在语言本身中包含type约束?
  • 拥有“类型提示”的好处是什么?我就不能把它放进文件串之类的地方吗?

据我所知,在python代码库本身中也没有看到这么多--大多数类型都是手动执行的,例如:argparse.py和我在https://github.com/python/cpython/blob/3.7/Lib/中浏览过的任何其他文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-10 22:40:29

python是否计划在语言本身中包含类型约束?

几乎肯定不是,也肯定不会在下一个主要版本之前。

拥有“类型提示”的好处是什么?我就不能把它放进文件串之类的地方吗?

从我的头顶上,考虑以下几点:

  • 类型提示可以使用像mypy这样的工具进行验证。
  • IDEs和其他工具可以使用类型提示来提供提示和提示。例如,当您调用一个函数并且刚刚编写了foo(时,IDE可以获取类型提示,并在旁边显示一个显示foo(x: int, y: List[int])的框。作为一名开发人员,您的优势在于您完全掌握了所需的信息,而不必大嚼整个docstring。
  • 类型提示可以由functools.singledispatch之类的模块使用,也可以由外部库(如multipledispatch )来添加其他与类型相关的特性(在本例中,根据名称和类型(而不仅仅是名称)分派函数调用)。
票数 8
EN

Stack Overflow用户

发布于 2022-05-09 14:54:55

利用类型提示的一个选项是强制执行模块。关于官方的python支持,似乎不太可能在不久的将来直接执行类型提示。

进入type_enforced,包允许您利用类型提示。它同时支持输入和输出类型。只有指定的类型才被强制执行。还支持多个可能的输入,这样您就可以指定int或float之类的内容。

首先验证输入类型(在函数调用上延迟),如果有效,则对函数进行处理,然后对返回值进行验证。

存在一些限制,因此不支持嵌套类型结构。例如,不能将类型指定为整数列表,而只能指定列表。您需要验证函数中列表中的项。

代码语言:javascript
复制
pip install type_enforced
代码语言:javascript
复制
>>> import type_enforced
>>> @type_enforced.Enforcer
... def my_fn(a: int , b: [int, str] =2, c: int =3) -> None:
...     pass
...
>>> my_fn(a=1, b=2, c=3)
>>> my_fn(a=1, b='2', c=3)
>>> my_fn(a='a', b=2, c=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 47, in __call__
    return self.__validate_types__(*args, **kwargs)
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 83, in __validate_types__
    self.__check_type__(assigned_vars.get(key), value, key)
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 56, in __check_type__
    self.__exception__(
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 37, in __exception__
    raise TypeError(f"({self.__fn__.__qualname__}): {message}")
TypeError: (my_fn): Type mismatch for typed function (my_fn) with `a`. Expected one of the following `[<class 'int'>]` but got `<class 'str'>` instead.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63838471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档