在看 type hint ,引发一个脑洞 如果 python 突然变成 静态类型的 语言,会变快吗? 语法简洁的特点会消失吗? 或者其他?
![]() | 1 ethego 2016-08-05 12:31:24 +08:00 ![]() |
![]() | 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  |
49 quxw OP  |
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 |