为啥很少人提 python 3 Function Annotations?

2016-04-01 21:06:55 +08:00
 wingyiu
>>> def f(ham: str, eggs: str = 'eggs') -> str:
...     print("Annotations:", f.__annotations__)
...     print("Arguments:", ham, eggs)
...     return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Arguments: spam eggs
'spam and eggs

这新功能简直是福音啊!

5931 次点击
所在节点    Python
21 条回复
oyjc
2016-04-01 21:22:53 +08:00
有啥用吗?为了静态编译?
ethego
2016-04-01 21:25:58 +08:00
@oyjc 目前就是简单的类型注释而已
lecher
2016-04-01 21:29:11 +08:00
文档学得好就用不上。
不过写测试脚本很有用,做规范性的接口检测。
ethego
2016-04-01 21:35:33 +08:00
@lecher 我觉得这么搞还不如静态类型+类型推断来的好,事实证明动态类型是一条歧路,好的类型推断已经能足够取得几乎一切动态类型的优势了。
wingyiu
2016-04-01 22:23:20 +08:00
@oyjc 类型检查、 RPC 参数转换等
zhuangzhuang1988
2016-04-01 22:35:53 +08:00
不好, 还不如 ts 来得爽。。 而且 python 中的默认参数也有坑。绑定在函数对象上, 而不是在函数代码中判断。
neoblackcap
2016-04-01 22:36:56 +08:00
这个其实问题不大,暂时也还是文档的作用。毕竟之前成型一点的项目文档也是会写上类型参数的,同时实现里面还一大堆 assert
guyskk
2016-04-01 23:28:09 +08:00
没什么用,顶多当作文档,动态类型有动态类型的特点,简单,灵活,不需要这些东西。
XIVN1987
2016-04-01 23:50:12 +08:00
@ethego
在 iPython 里面做计算或学习库的时候为了简单一个变量名来回用,一个 d 刚开始赋值字符串,计算过程中赋值数组、 ndarray 各种类型的值随便赋,,静态类型怎么做到??

难道在这种探索性学习、研究的时候还有考虑怎么给变量命名的问题吗??
Kilerd
2016-04-01 23:58:53 +08:00
怎么感觉跟 Swift 越来越像了

管他呢,反正我是 py2
ethego
2016-04-02 02:16:08 +08:00
@XIVN1987 这些类型推断也可以做到。数组的话你需要考虑并集和泛型的问题,但是就算是动态类型,你一样也需要思考这些,不然程序未免不出 bug
XIVN1987
2016-04-02 08:04:40 +08:00
@ethego
类型推断只是不需要写出类型,可一个变量一旦推断出类型是字符串就不能再给它赋其他类型的值了,所以叫静态类型

而且我说的是在 ipython 中交互式的实验、验证、探索,注意我说的场景
Frapples
2016-04-02 09:36:43 +08:00
个人觉得用处还是很大的,一般需要动态语言的灵活性的地方不多,在不需要这种灵活性的地方用这种语法,大大减少了 bug 。
否则,就是一次 coding,到处 debug 了。。。
janxin
2016-04-02 10:28:52 +08:00
现在都在看 type hint 吧
bdbai
2016-04-02 10:39:45 +08:00
@zhuangzhuang1988 活捉传教士一枚
ethego
2016-04-02 11:31:01 +08:00
@XIVN1987 你啊,不要总想着搞个大新闻,把静态类型批判一番, naive

Rust: https://play.rust-lang.org/?gist=8a301713d15d44d5a80c44d28d5d0c72&version=nightly&backtrace=0

Crystal: https://play.crystal-lang.org/#/r/vsl

这确实不叫赋值,叫重新绑定。对于结构体,你可以用泛型来做到,只需一点安全必要的牺牲。 iPython 那种 REPL ,现在很多静态语言都有啊。
wingyiu
2016-04-02 11:50:44 +08:00
@Kilerd 这 function anotation 是可选的,而且没有规定非要传类型,想象空间还是有的
lins05
2016-04-02 11:54:46 +08:00
对 jedi 这种工具,还是有不少增强的 https://github.com/davidhalter/jedi/pull/661
XIVN1987
2016-04-02 14:38:11 +08:00
@ethego
好吧,我错了,,没学习过 Rust 、 Crystal 这样的语言,没想到静态语言也可以这样
pynix
2016-04-03 04:41:52 +08:00
后期应该会给予这个做 jit 优化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX