在看 type hint ,引发一个脑洞 如果 python 突然变成 静态类型的 语言,会变快吗? 语法简洁的特点会消失吗? 或者其他?
1
ethego 2016-08-05 12:31:24 +08:00 1
|
2
changshu 2016-08-05 12:33:00 +08:00
Cython 欢迎你.
|
4
zhuangzhuang1988 2016-08-05 12:39:53 +08:00
会快, 起码,开发效率会变高..
妈妈再也不怕我传错参数了, 参数类型了.. |
5
eriale 2016-08-05 12:45:56 +08:00
python 3.5 支持 type hint , Pycharm 已经支持了,如果你把参数类型写清楚, pycharm 可以准确找到类型,补全跟 java 一样准确: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html
我个人感觉 type hint 鸡肋,加上了类型信息,只提高了补全精度,感觉不划算。 |
6
yangtukun1412 2016-08-05 12:51:34 +08:00
Cython+1
|
7
linescape 2016-08-05 13:45:36 +08:00
你说的不就是 go 么
|
8
clino 2016-08-05 13:47:10 +08:00
cython +1 楼主可以试试
|
9
noli 2016-08-05 13:51:50 +08:00 via iPhone
如果我说, python 其实一直都是静态类型的,想知道有多少人会反对。
|
10
raysonx 2016-08-05 14:00:40 +08:00 via Android
|
11
ethego 2016-08-05 14:02:51 +08:00
@noli 要么你混淆了静态类型和强类型,要么你完全不懂静态类型的概念, python 的类型要在运行时才能确定,怎么可能是静态类型?
|
12
noli 2016-08-05 14:07:05 +08:00 via iPhone
@raysonx python 是强类型的然后类型是动态绑定的,这个好像大家都没有异议。莫非楼主说的静态类型说的就是动态类型绑定的相对概念?
|
14
reus 2016-08-05 15:48:14 +08:00
怎么变?怎么在编译时确定所有值的类型而不对语言大改大砍?
这只能叫,设计一个新语言,并起名叫 python 而已。 |
15
wizardforcel 2016-08-05 16:29:28 +08:00 via Android
我一直把它当成静态类型写的。。。
给类型推断的话稍微改改就能通过了。 |
16
roychan 2016-08-05 16:40:18 +08:00
CPython 不是个 Python 实现么?跟语言本身的性质有什么关系…
|
17
roychan 2016-08-05 16:53:23 +08:00
看错了,请无视我= =
|
18
larme 2016-08-05 17:10:34 +08:00
|
19
harry890829 2016-08-05 17:35:14 +08:00
那个……我问下,静态语言不是必须经过编译成二进制文件才能运行么?这不是最大的区别?
|
20
SlipStupig 2016-08-05 17:46:50 +08:00
@harry890829 如果用了 JIT 这种技术,算静态还是动态呢?
|
21
harry890829 2016-08-05 18:04:17 +08:00
@harry890829 看了下 jit 的介绍,也是有个编译的过程吧……
|
22
quxw OP 我的理解
静态类型就是运行过程中,变量的类型不能改变,因为类型固定,并编译运行过程中很多行为都可预测,进而可以优化。 C 是静态 弱类型 强检查 python 是动态 抢类型 Java 是静态 强类型的 pypy 是加了 jit 还是一个动态语言 |
23
quxw OP 我是因为用 pycharm 和 type hint 后,觉得即使 python 变成一本静态语言,写起来变化也不大,反而能提升性能, ide 检查等优势,好像也不错。
|
24
quxw OP jit 是处在 解释型 和 编译型 之间的一个概念,和动态静态太大关系吧。
|
25
noli 2016-08-05 19:49:19 +08:00
@ethego
``` import copy class Foo: cls_val = 'Foo' pass class Bar: cls_val = 'Bar' pass foo, bar = Foo(), Bar() bar2 = copy.copy(bar) setattr(bar.__class__, 'cls_val2', 'Bar2') print(dir(bar.__class__)) print(dir(bar2.__class__)) ``` 以上代码,我们可以预见, 两个 print 语句打印的内容是一样的。 现在,假设有一种语言,执行了像 setatter(bar.__class__) 这样的语句之后,并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 。 这种该叫做什么类型的语言? |
26
bdbai 2016-08-05 19:53:16 +08:00 via Android
@noli 静态不是绝对的。就拿 C# 来说,它支持反射,还提供了 dynamic 关键字,你能说它是动态么?
|
27
noli 2016-08-06 01:55:00 +08:00 via iPhone
@bdbai dynamic 关键字实际上什么也没干,只是提示编译器不去检查属性的有效性。这种效果 c++也可以办得到,然而这不影响它的静态类型绑定,只是针对一类特别强大的静态类型的语法糖。然而这好像跟我提的那个问题好像没什么关系
|
29
noli 2016-08-06 13:47:26 +08:00 via iPhone
@bdbai 我的意思也只是想说明,静态类型还可能有别的理解方式,当然就这个帖子本身,我这个理解是不适合的。
然而我也并不同意你的观点,涉及到对类型系统的操作,在各种语言中都是比较冷知识的,然而效果差别非常大,所以这简直就是最好的用来描述语言特性的论据。 |
30
bdbai 2016-08-06 14:41:58 +08:00 via Android
@noli IMHO 动态和静态只是对某个语言特性的总体描述。为了方便,一门静态语言有可能在设计时加入了一点动态成分,总体上并不影响这门语言本身的性质。
C# 或者说 .NET Framework 有 DLR ,这应该算是静态类型系统的一个缺口吧。 |
31
ethego 2016-08-07 12:37:52 +08:00
@noli 那是 reference type 和 value type 的区别,只是在这里 python 的 oop 给了 hook 允许你去修改__class__这个属性而已
|
32
ethego 2016-08-07 12:46:31 +08:00
@noli 这里的__class__是一个引用,你在 copy 的时候两个实例共用了一个引用,当然会被一起修改了。如果你用 deep copy 就不会出现这种情况了。而你说的那种“新语言”只是把这种 reference type 换成了 value type 而已,和静态类型还是动态类型没有关系。现代程序语言早就已经抛弃了 value type 这样的特性。
|
33
franklinyu 2016-08-07 14:07:44 +08:00
@bdbai 「支持反射」和「动态 /静态类型」没关系吧, Java 也支持反射。
|
34
franklinyu 2016-08-07 14:13:04 +08:00
@ethego 说得对。我倒是觉得,像他说的那种「并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 」,在某种意义上是更加的静态了,因为不影响这个类的其他成员。
|
35
ethego 2016-08-07 14:21:34 +08:00
@franklinyu value type 有比较严重的性能问题,现在的语言都选择的 reference type
|
36
noli 2016-08-07 14:35:34 +08:00
@ethego 你确定,把 copy 改成 deepcopy ,对于我举的例子,会产生变化?
python 2.7.10 和 python3.5.1 不支持你的说法。 |
37
ethego 2016-08-07 14:42:07 +08:00
@noli 我没去验证,或许 class 对于 metaclass 来说只能是单例的。但这不影响我有关 reference type 的说法的正确性
|
44
bdbai 2016-08-07 17:16:24 +08:00 via Android
@franklinyu 反射这个例子确实举得不好。 DLR 这一点可以吧。
|
46
franklinyu 2016-08-08 02:34:50 +08:00
@ethego 但是我还是比较喜欢像 C++ 那样,让我能够指定使用 value type 还是 reference type 。(中文是叫「值类型」和「引用类型」么?)有一部分性能问题可以用 C++11 的 move semantics 解决,剩下的我会显式指定成引用 /指针。
|
47
franklinyu 2016-08-08 03:02:42 +08:00
@bdbai {{44L}}:我不了解微软的「动态语言运行时( Dynamic Language Runtime )」,仅仅对 Objective-C 的运行时原理略知一二。你认为,「运行时」的存在会影响这个语言的「动态 /静态类型」的属性;我猜测,是因为我们可以往现有的类里面增加特性?如果是这样,那我认为「可以在变量被定义以后修改变量的 attribute 」并不会让这个语言变成动态类型语言。
|
48
quxw OP ![从一本书里翻出来的采访]( https://raw.githubusercontent.com/quxiaowei/7788/master/IMG_0895.JPG "从一本书里翻出来的采访")
|
49
quxw OP ![从一本书里翻出来的采访]( https://raw.githubusercontent.com/quxiaowei/7788/master/IMG_0895.JPG)
|
50
quxw OP |
51
quxw OP |
52
ethego 2016-08-14 20:25:58 +08:00 via iPhone
@franklinyu 最后你还是会发现你绝大多数时候都在用指针,毕竟引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥
|
53
ethego 2016-08-14 20:29:43 +08:00 via iPhone
@franklinyu 在 java 中,值类型仅被用于一种优化: inline (内联)。任何时候对引用类型的需求都更高,那为什么不默认引用类型?
|
54
franklinyu 2016-08-16 08:13:11 +08:00
@ethego {{52L}}:「引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥」這個我覺得見仁見智吧,我一般都用值類型,很少建立指針。就算偶爾建立指針,用的也是 smart pointer 。
|
55
franklinyu 2016-08-16 08:13:55 +08:00
樓上的 @quxw 是網卡了麼
|
56
franklinyu 2016-08-16 08:16:15 +08:00
Guido 說得挺對的,所以 C++11 加入了 auto
|