Python 中类型提示的好处是啥? [关闭]

Posted

技术标签:

【中文标题】Python 中类型提示的好处是啥? [关闭]【英文标题】:What will be the benefits of type hinting in Python? [closed]Python 中类型提示的好处是什么? [关闭] 【发布时间】:2016-11-08 02:09:35 【问题描述】:

我正在阅读PEP 484 -- Type Hints

当它被实现时,函数指定它接受和返回的参数类型。

def greeting(name: str) -> str:
    return 'Hello ' + name

我的问题是,如果使用 Python 进行类型提示有什么好处?

我在类型有用的地方使用了 TypeScript(因为 javascript 在类型识别方面有点愚蠢),而 Python 在类型方面有点智能,如果实现类型提示会给 Python 带来什么好处?这会提高 python 的性能吗?

【问题讨论】:

从你链接的同一个 pep “相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行他们的源代码。本质上,这样的类型检查器充当了一个非常强大的 linter”我会说它的价值是进行构建时语法检查,以避免那些可怕的运行时错误。 我记得在某处看到其中一个意图是工具和框架。例如,GUI 框架可能能够检查 int 输入字段是否设置为仅验证/允许。 【参考方案1】:

以类型化函数为例,

def add1(x: int, y: int) -> int:
    return x + y

还有一个通用函数。

def add2(x,y):
    return x + y

add1 上使用 mypy 进行类型检查

add1("foo", "bar")

会导致

error: Argument 1 to "add1" has incompatible type "str"; expected "int"
error: Argument 2 to "add2" has incompatible type "str"; expected "int"

add2 上不同输入类型的输出,

>>> add2(1,2)
3

>>> add2("foo" ,"bar")
'foobar'

>>> add2(["foo"] ,['a', 'b'])
['foo', 'a', 'b']

>>> add2(("foo",) ,('a', 'b'))
('foo', 'a', 'b')

>>> add2(1.2, 2)
3.2

>>> add2(1.2, 2.3)
3.5

>>> add2("foo" ,['a', 'b'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in add
TypeError: cannot concatenate 'str' and 'list' objects

请注意,add2 是通用的。 TypeError 仅在该行执行后引发,您可以通过类型检查来避免这种情况。类型检查可让您从一开始就识别类型不匹配。

优点:

更轻松的调试 == 节省时间 减少手动类型检查 更轻松的文档记录

缺点:

交易 Python 代码之美。

【讨论】:

【参考方案2】:

类型提示可以帮助:

    数据验证和代码质量(您也可以使用 assert)。 编译代码时的代码速度,因为可以采取一些假设和更好的内存管理。 文档代码和可读性。

我一般缺乏类型提示也是有好处的:

    原型制作速度更快。 在大多数情况下不需要类型提示 - 鸭子总是鸭子 - 做它变量的行为不会像鸭子那样没有类型提示会出错。 可读性 - 实际上我们在大多数情况下不需要任何类型提示。

我认为类型提示是可选的而不像 Java、C++ 那样需要 - 过度优化会扼杀创造力 - 我们真的不需要关注变量的类型,而是首先关注算法 - 我个人认为最好写一行代码而不是 4 来定义像 Java 一样的简单函数 :)

def f(x):
  return x * x

相反

int f(int x) 

   return x * x


long f(long x) 

   return x * x


long long f(int long) 

   return x * x

...或使用模板/泛型

【讨论】:

以上是关于Python 中类型提示的好处是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

关闭一个分支是啥意思?

字符串的数据类型是啥? [关闭]

Python - 所有内置装饰器是啥? [关闭]

与 Node.js 一起使用的最佳测试框架是啥? [关闭]

MIME 类型到底是啥 [关闭]

在 python 中,将函数用作类的属性的正确语法是啥? [关闭]