如何在Python中强制静态类型?

28
自从Python 3.6提供静态类型以来,是否可以强制对Python项目或一组Python文件进行静态类型化?

4
目前 Python 还不支持静态类型,但可以使用类型提示或类型注释来为像 mypy 这样的静态分析器提供信息,它们与静态类型并不相同。 - phd
1
@Drako TypeError是正常的Python操作。即,如果您删除提示,它仍会引发错误('this is ' + <int>引发错误)。对于我来说(Python 3.6.1),def f(s: str) -> str: return 0然后调用f(0)不会引发TypeError。 - Artyer
相关的内容,如果不是重复的话:https://dev59.com/9lwY5IYBdhLWcg3wgH3y中的类型提示是什么/32558710#32558710和https://dev59.com/xFkS5IYBdhLWcg3wXFnc 3.6中的变量注释是什么?noredirect=1&lq=1? - Dimitris Fasarakis Hilliard
1
@Drako:根据PEP484,运行时没有类型检查:https://www.python.org/dev/peps/pep-0484/ - Ando Jurai
1
你是否考虑过使用type_enforced来强制执行静态类型提示?请参见:https://github.com/connor-makowski/type_enforced - conmak
use mypy to enforce it - undefined
2个回答

14

我认为你不能强制使用静态类型,但可以使用检查器,如 mypy

根据 Tim Peters 在《Python之禅》中第2行的说法,“显式优于隐式”。静态类型是一件好事,但“简单胜于复杂”...

$ python3.6
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

1
静态类型(通常)比动态类型更好!这不仅仅是关于效率,而是关于可读性。例如,“User”是名字、数字、系统结构、数据库行还是其他什么?Java从Lisp得到的伟大想法并赋予了C#,就是脚本语言和高效语言之间无需二分法。两者都可以兼得。特别是C#能够生成既高效又易于使用的代码。 - Tuntable
1
静态类型是明确的,更易读且减少了歧义。Python 应该有一种模式来强制执行它(mypy 风格可以)。最终,它可以在加载时使用此强制执行来生成优化的字节码。 - undefined
为什么不使用类似type_enforced这样的工具来进行即时类型检查呢? - undefined

14

您可以在Python3中使用注释,这可能会帮助您获得一些静态类型的好处。

然而,如果完全强制执行静态类型,则它不再是Python。 它是一种鸭子类型的动态语言,并且作为结果将失去所有动态性。 如果您真的想使用静态类型的语言,最好不要使用Python。


6
我喜欢它的动态性,但Python也在不断发展。当一个项目超过一定阈值时,类型检查开始变得非常重要,呈指数级增长。我认为这门语言最终会允许可选的类型强制执行,这有很大可能性。 - j4hangir
2
我会选择可选的强制执行,类似于mypy。个人而言,我发现自己在几乎所有的代码中都使用类型提示,因为使用好的IDE总是有很大的回报。 - j4hangir
@j4hangir 但是这样你就会开始期望别人也做同样的事情。这就是问题开始出现的地方。 - hspandher
是的,你说得对,我当然不赞成强制使用它,但如果有内置工具来检查参数类型(当它们被选择性地注释时),那将非常好。我们不需要为i指定int类型,但传递错误的参数、错误的顺序等一直是让我头痛的问题来源。 - j4hangir
1
我并不否认静态类型的好处。我是说它既有优点也有缺点。而且有一些可用的工具,比如kite和anaconda,可以提供你想要的某种IDE功能。当然,它们的效果不会像你期望的那样有效。 - hspandher
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接