如果 python 突然变成 静态类型的 语言? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
quxw
V2EX    程序员

如果 python 突然变成 静态类型的 语言?

  •  
  • &nbp; quxw 2016-08-05 12:11:02 +08:00 7842 次点击
    这是一个创建于 3366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在看 type hint ,引发一个脑洞 如果 python 突然变成 静态类型的 语言,会变快吗? 语法简洁的特点会消失吗? 或者其他?

    56 条回复    2016-08-16 08:16:15 +08:00
    ethego
        1
    ethego  
       2016-08-05 12:31:24 +08:00   1
    changshu
        2
    changshu  
       2016-08-05 12:33:00 +08:00
    Cython 欢迎你.
    quxw
        3
    quxw  
    OP
       2016-08-05 12:36:47 +08:00
    @ethego 我看了一下,这个好像只是个检查,底层还是标准的 python
    zhuangzhuang1988
        4
    zhuangzhuang1988  
       2016-08-05 12:39:53 +08:00
    会快, 起码,开发效率会变高..
    妈妈再也不怕我传错参数了, 参数类型了..
    eriale
        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 鸡肋,加上了类型信息,只提高了补全精度,感觉不划算。
    yangtukun1412
        6
    yangtukun1412  
       2016-08-05 12:51:34 +08:00
    Cython+1
    linescape"
        7
    linescape  
       2016-08-05 13:45:36 +08:00
    你说的不就是 go 么
    clino
        8
    clino  
       2016-08-05 13:47:10 +08:00
    cython +1 楼主可以试试
    noli
        9
    noli  
       2016-08-05 13:51:50 +08:00 via iPhone
    如果我说, python 其实一直都是静态类型的,想知道有多少人会反对。
    ethego
        11
    ethego  
       2016-08-05 14:02:51 +08:00
    @noli 要么你混淆了静态类型和强类型,要么你完全不懂静态类型的概念, python 的类型要在运行时才能确定,怎么可能是静态类型?
    noli
        12
    noli  
       2016-08-05 14:07:05 +08:00 via iPhone
    @raysonx python 是强类型的然后类型是动态绑定的,这个好像大家都没有异议。莫非楼主说的静态类型说的就是动态类型绑定的相对概念?
    ethego
        13
    ethego  
       2016-08-05 14:22:52 +08:00
    @noli 静态类型只有一种理解。
    reus
        14
    reus  
       2016-08-05 15:48:14 +08:00
    怎么变?怎么在编译时确定所有值的类型而不对语言大改大砍?
    这只能叫,设计一个新语言,并起名叫 python 而已。
    wizardforcel
        15
    wizardforcel  
       2016-08-05 16:29:28 +08:00 via Android
    我一直把它当成静态类型写的。。。

    给类型推断的话稍微改改就能通过了。
    roychan
        16
    roychan  
       2016-08-05 16:40:18 +08:00
    CPython 不是个 Python 实现么?跟语言本身的性质有什么关系…
    roychan
        17
    roychan  
       2016-08-05 16:53:23 +08:00
    看错了,请无视我= =
    larme
        18
    larme  
       2016-08-05 17:10:34 +08:00
    harry890829
        19
    harry890829  
       2016-08-05 17:35:14 +08:00
    那个……我问下,静态语言不是必须经过编译成二进制文件才能运行么?这不是最大的区别?
    SlipStupig
        20
    SlipStupig  
       2016-08-05 17:46:50 +08:00
    @harry890829 如果用了 JIT 这种技术,算静态还是动态呢?
    harry890829
        21
    harry890829  
       2016-08-05 18:04:17 +08:00
    @harry890829 看了下 jit 的介绍,也是有个编译的过程吧……
    quxw
        22
    quxw  
    OP
       2016-08-05 19:03:49 +08:00 via iPhone
    我的理解
    静态类型就是运行过程中,变量的类型不能改变,因为类型固定,并编译运行过程中很多行为都可预测,进而可以优化。
    C 是静态 弱类型 强检查
    python 是动态 抢类型
    Java 是静态 强类型的

    pypy 是加了 jit 还是一个动态语言
    quxw
        23
    quxw  
    OP
       2016-08-05 19:10:12 +08:00 via iPhone
    我是因为用 pycharm 和 type hint 后,觉得即使 python 变成一本静态语言,写起来变化也不大,反而能提升性能, ide 检查等优势,好像也不错。
    quxw
        24
    quxw  
    OP
       2016-08-05 19:14:45 +08:00 via iPhone
    jit 是处在 解释型 和 编译型 之间的一个概念,和动态静态太大关系吧。
    noli
        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 。

    这种该叫做什么类型的语言?
    bdbai
        26
    bdbai  
       2016-08-05 19:53:16 +08:00 via Android
    @noli 静态不是绝对的。就拿 C# 来说,它支持反射,还提供了 dynamic 关键字,你能说它是动态么?
    noli
        27
    noli  
       2016-08-06 01:55:00 +08:00 via iPhone
    @bdbai dynamic 关键字实际上什么也没干,只是提示编译器不去检查属性的有效性。这种效果 c++也可以办得到,然而这不影响它的静态类型绑定,只是针对一类特别强大的静态类型的语法糖。然而这好像跟我提的那个问题好像没什么关系
    bdbai
        28
    bdbai  
       2016-08-06 11:44:10 +08:00 via Android
    @noli 我的意思是,不要用某一特殊的特性来判断动态还是静态。
    noli
        29
    noli  
       2016-08-06 13:47:26 +08:00 via iPhone
    @bdbai 我的意思也只是想说明,静态类型还可能有别的理解方式,当然就这个帖子本身,我这个理解是不适合的。

    然而我也并不同意你的观点,涉及到对类型系统的操作,在各种语言中都是比较冷知识的,然而效果差别非常大,所以这简直就是最好的用来描述语言特性的论据。
    bdbai
        30
    bdbai  
       2016-08-06 14:41:58 +08:00 via Android
    @noli IMHO 动态和静态只是对某个语言特性的总体描述。为了方便,一门静态语言有可能在设计时加入了一点动态成分,总体上并不影响这门语言本身的性质。
    C# 或者说 .NET Framework 有 DLR ,这应该算是静态类型系统的一个缺口吧。
    ethego
        31
    ethego  
       2016-08-07 12:37:52 +08:00
    @noli 那是 reference type 和 value type 的区别,只是在这里 python 的 oop 给了 hook 允许你去修改__class__这个属性而已
    ethego
        32
    ethego  
       2016-08-07 12:46:31 +08:00
    @noli 这里的__class__是一个引用,你在 copy 的时候两个实例共用了一个引用,当然会被一起修改了。如果你用 deep copy 就不会出现这种情况了。而你说的那种“新语言”只是把这种 reference type 换成了 value type 而已,和静态类型还是动态类型没有关系。现代程序语言早就已经抛弃了 value type 这样的特性。
    franklinyu
        33
    franklinyu  
       2016-08-07 14:07:44 +08:00
    @bdbai 「支持反射」和「动态 /静态类型」没关系吧, Java 也支持反射。
    franklinyu
        34
    franklinyu  
       2016-08-07 14:13:04 +08:00
    @ethego 说得对。我倒是觉得,像他说的那种「并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 」,在某种意义上是更加的静态了,因为不影响这个类的其他成员。
    ethego
        35
    ethego  
       2016-08-07 14:21:34 +08:00
    @franklinyu value type 有比较严重的性能问题,现在的语言都选择的 reference type
    noli
        36
    noli  
       2016-08-07 14:35:34 +08:00
    @ethego 你确定,把 copy 改成 deepcopy ,对于我举的例子,会产生变化?
    python 2.7.10 和 python3.5.1 不支持你的说法。
    ethego
        37
    ethego  
       2016-08-07 14:42:07 +08:00
    @noli 我没去验证,或许 class 对于 metaclass 来说只能是单例的。但这不影响我有关 reference type 的说法的正确性
    noli
        38
    noli  
       2016-08-07 14:56:45 +08:00
    @ethego 那你下次记得验证一下再说,"用 deepcopy 就不会出现这种情况“.
    ethego
        39
    ethego  
       2016-08-07 15:09:27 +08:00
    @noli 这句话说出来就好像你之前说的都是对的一样
    noli
        40
    noli  
       2016-08-07 15:22:44 +08:00 via iPhone
    @ethego 欢迎你指出并指教
    ethego
        41
    ethego  
       2016-08-07 15:48:09 +08:00 via iPhone
    @noli 我说过了,你混淆了值类型和静态类型的概念
    noli
        42
    noli  
       2016-08-07 16:30:00 +08:00 via iPhone
    @ethego 你从哪里判断我混淆了?因为我问有多少人反对 python 是静态类型?
    ethego
        43
    ethego  
       2016-08-07 17:03:57 +08:00
    @noli 嘴硬,如果你没有混淆,那你 25 楼给出的程序和本贴有关吗?
    bdbai
        44
    bdbai  
       2016-08-07 17:16:24 +08:00 via Android
    @franklinyu 反射这个例子确实举得不好。 DLR 这一点可以吧。
    noli
        45
    noli  
       2016-08-07 19:45:01 +08:00 via iPhone
    @ethego 的确无关,所以我问你这叫什么类型。
    franklinyu
        46
    franklinyu  
       2016-08-08 02:34:50 +08:00
    @ethego 但是我还是比较喜欢像 C++ 那样,让我能够指定使用 value type 还是 reference type 。(中文是叫「值类型」和「引用类型」么?)有一部分性能问题可以用 C++11 的 move semantics 解决,剩下的我会显式指定成引用 /指针。
    franklinyu
        47
    franklinyu  
       2016-08-08 03:02:42 +08:00
    @bdbai {{44L}}:我不了解微软的「动态语言运行时( Dynamic Language Runtime )」,仅仅对 Objective-C 的运行时原理略知一二。你认为,「运行时」的存在会影响这个语言的「动态 /静态类型」的属性;我猜测,是因为我们可以往现有的类里面增加特性?如果是这样,那我认为「可以在变量被定义以后修改变量的 attribute 」并不会让这个语言变成动态类型语言。
    quxw
        48
    quxw  
    OP
       2016-08-08 13:48:39 +08:00
    ![从一本书里翻出来的采访]( https://raw.githubusercontent.com/quxiaowei/7788/master/IMG_0895.JPG "从一本书里翻出来的采访")
    quxw
        49
    quxw  
    OP
       2016-08-08 13:51:50 +08:00
    quxw
        50
    quxw  
    OP
       2016-08-08 13:56:00 +08:00
    quxw
        51
    quxw  
    OP
       2016-08-08 14:11:31 +08:00
    ethego
        52
    ethego  
       2016-08-14 20:25:58 +08:00 via iPhone
    @franklinyu 最后你还是会发现你绝大多数时候都在用指针,毕竟引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥
    ethego
        53
    ethego  
       2016-08-14 20:29:43 +08:00 via iPhone
    @franklinyu 在 java 中,值类型仅被用于一种优化: inline (内联)。任何时候对引用类型的需求都更高,那为什么不默认引用类型?
    franklinyu
        54
    franklinyu  
       2016-08-16 08:13:11 +08:00
    @ethego {{52L}}:「引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥」我得仁智吧,我一般都用值型,很少建立指。就算偶建立指,用的也是 smart pointer 。
    franklinyu
        55
    franklinyu  
       2016-08-16 08:13:55 +08:00
    上的 @quxw 是卡了
    franklinyu
        56
    franklinyu  
       2016-08-16 08:16:15 +08:00
    Guido 得挺的,所以 C++11 加入了 auto
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3167 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 11:12 PVG 19:12 LAX 04:12 JFK 07:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86