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