习惯了静态类型语言,这两天写 Python ,每个函数开始时都带一坨 assert isinstance ... - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
metorm
V2EX    Python

习惯了静态类型语言,这两天写 Python ,每个函数开始时都带一坨 assert isinstance ...

  •  
  •   metorm 2018-08-04 11:19:10 +08:00 via Android 6280 次点击
    这是一个创建于 2628 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写的是一个简单的物理仿真计算程序。这算好习惯还是坏习惯? 养成这个习惯是因为有一次被 numpy 的 1x1 数组坑了好久……

    35 条回复    2018-08-05 13:53:01 +08:00
    orangeade
        1
    orangeade  
       2018-08-04 11:27:04 +08:00
    用 python 3.7
    013231
        2
    013231  
       2018-08-04 11:28:51 +08:00
    typing 不行吗?
    013231
        3
    013231  
       2018-08-04 11:29:04 +08:00
    wwqgtxx
        4
    wwqgtx  
       2018-08-04 11:57:00 +08:00 via iPhone
    @013231 typing 只是起提示作用,类型检查并不是强制的
    Em5O7B1JGfjQnBry
        5
    Em5O7B1JGfjQnBry  
       2018-08-04 12:08:39 +08:00 via Android
    3.5 之后,可以用 type hint,然后在运行前,用 mypy 检查一遍
    xrlin
        6
    xrlin  
       2018-08-04 12:15:18 +08:00
    没办法,动态类型就是这样,动态类型是把双刃剑。
    xrlin
        7
    xrlin  
       2018-08-04 12:16:31 +08:00
    我一般用 python 写比较大一点的项目,会加上简单类型说明和比较详细的 docstring。
    metorm
        8
    metorm  
    OP
       2018-08-04 12:22:38 +08:00 via Android
    @013231 之前只是耳闻。刚才看了一下你发的链接,感觉这个手段入侵性有点强,后面顶不住了再考虑吧……
    lihongjie0209
        9
    lihongjie0209  
       2018-08-04 12:27:31 +08:00
    正常操作, 动态语言都这样. 现在又在加 typing 啊什么的, 我 TM 都写类型了,我为什么不用静态语言, 而且这个 typing 还不能保证编译安全, 鸡肋一个
    asdf123101
        10
    asdf123101  
       2018-08-04 12:39:11 +08:00 via Android
    动态语言就是这样的呀,不要用静态的思路去考量动态语言。用动态语言的意义不就是先把应用做出来,把结果跑出来吗。要性能和安全的时候再用 Java,C++就好了。
    karllynn
        11
    karllynn  
       2018-08-04 12:40:32 +08:00
    这样会很慢啊…输入输出要按契约编程,写在 docstring 里就可以了
    skinny
        12
    skinny  
       2018-08-04 12:42:29 +08:00
    @lihongjie0209 确实如此,特别是复杂一点的类型还要写一坨代码,唯一有点用的地方是对 IDE 解析友好,代码提示更清晰准确。如果真的非常追求静态类型检查,真的不必用这种方法,换一种语言更好,比如 C#。
    lihongjie0209
        13
    lihongjie0209  
       2018-08-04 12:44:47 +08:00
    @skinny #12 动态语言的代码提示基本为 0, 写代码 10 分钟, 查手册看参数和返回值半小时
    blacklee
        14
    blacklee  
       2018-08-04 12:45:02 +08:00 via iPhone
    没事,我写 ruby 也是这样。
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2018-08-04 12:45:15 +08:00
    来用 F#吧
    爽歪歪。
    lihongjie0209
        16
    lihongjie0209  
       2018-08-04 12:55:44 +08:00
    题主问题的本质在于: 对于一个语言的心理定位和现实使用情况不符合.

    对于我来说, Python 是 better bash, 只要能写脚本就 OJBK 了, 我不关心:
    1. GIL
    2. Python3.X, 我现在还在用 Python2.6(CentOS6 自带的)
    3. 静态类型

    因为这些东西 bash 也没有, 我用 bash 写脚本也不会享受到这些优点.

    仿真计算我不懂, 但是在 Python 之前一定有其他软件可以做, 题主应该更关注于 Python 带给了你什么优势, 而不是它和 xxx 语言相比有什么劣势.

    脚本语言的命, 别操着静态工程语言的心.
    Trim21
        17
    Trim21  
       2018-08-04 12:56:49 +08:00 via Android
    @lihongjie0209 用了 typing 之后 pycharm 的自动补全还是挺爽的,如果库作者相应的 doc string 里写明了参数类型和返回值也能进行类似的参数推导
    lihongjie0209
        18
    lihongjie0209  
       2018-08-04 13:01:29 +08:00
    @Trim21 #17 给你返回一个 map, tuple 你怎么做自动补全, 怎么知道返回值中到底有什么? Python 的问题是脚本语言的灵活性给程序员带来了偷懒的机会, 返回 map 最简单, 但是后续的维护太难做.
    orangeade
        19
    orangeade  
       2018-08-04 13:13:56 +08:00
    @lihongjie0209 #9 你 Java 干嘛加 var 类型推导呢 好好地手写不就行了
    fancyhan
        20
    fancyhan  
       2018-08-04 13:18:08 +08:00
    如果做科学计算,还是 fall fast 比较好,我觉得可以
    Trim21
        21
    Trim21  
       2018-08-04 13:19:30 +08:00 via Android
    @lihongjie0209 map 是最难受的,找不到一个办法能标注自己到底有哪些 key,看了 typing 的文档里也没有…
    lihongjie0209
        22
    lihongjie0209  
       2018-08-04 13:26:24 +08:00
    @orangeade #19 你说的是 Java 10 Local Variable Type Inference, 随手 google 了一下

    https://developer.oracle.com/java/jdk-10-local-variable-type-inference


    Clearly, defining types for fields and method signatures enforces a contract that needs to be respected and this helps with maintenance as well as understanding. However, declaring types for intermediate expressions may feel less useful and cumbersome.

    这篇文章我没看完, 但是看到这里你大概知道了 java 的 var 关键词是用来干嘛的了吧.


    其次, 一个语言支持的特性要全都用上吗? 我不这么认为, 我的变量都是后期 refactor 出来的, IDE 自动提取, 至于说 IDE 帮我生成的是 var 还是具体类型, 我是一点都关心
    lihongjie0209
        23
    lihongjie0209  
       2018-08-04 13:28:01 +08:00
    @Trim21 #21 我之前写个脚本都快被搞崩溃了, 更别说大项目中使用 map 了, Java 好一点, 大家都会定义一个类, 也不是强制要求,但是大部分编码规范是这样的
    Cbdy
        24
    Cbdy  
       2018-08-04 13:49:51 +08:00 via Android   3
    随着各类程序设计工具的完善,动态语言引以为傲的简洁与动态性的优势渐渐消失,甚至在大多数时候成为鸡肋。容易注意到,现在流行的新语言都拥有静态类型系统,而早年流行的动态语言,也渐渐加上了静态类型的帽子(或方言),以便分析工具进行静态分析,把错误消除在编程阶段
    Raymon111111
        25
    Raymon111111  
       2018-08-04 14:06:06 +08:00
    动态类型语言只能写小东西

    大一点查问题查死你
    justdoit123
        26
    justdoit123  
       2018-08-04 16:23:14 +08:00 via iPhone
    借用王垠的一句话:“竟然还有五头的人”
    justdoit123
        27
    justdoit123  
       2018-08-04 16:23:34 +08:00 via iPhone
    copie
        28
    copie  
       2018-08-05 01:26:43 +08:00 via Android
    Python 的思想不应该是能运行 Python 解释器会想一切办法运行,不能运行就抛出异常。在代码里面放太多的类型检查会导致代码异味。
    lolizeppelin
        29
    lolizeppelin  
       2018-08-05 03:00:15 +08:00 via Android
    我觉得是你结构设计问题

    openstack 那么大项目都没这么搞


    一般的克通用的函数检查接口用装饰器就完了
    janxin
        30
    janxin  
       2018-08-05 08:19:32 +08:00
    q397064399
        31
    q397064399  
       2018-08-05 09:34:40 +08:00
    定位不清晰啊,老铁,Python 的定位就是 灵活 脚本,把它该干好的事情 干好就行了
    老想着用一门语言 解决所有问题 ,不是傻就是蠢
    tohearts
        32
    tohearts  
       2018-08-05 10:57:33 +08:00
    31 楼老哥说的对
    lrxiao
        33
    lrxiao  
       2018-08-05 10:59:06 +08:00
    mypy 这种检查一遍项目
    PythonAnswer
        34
    PythonAnswer  
       2018-08-05 11:58:18 +08:00 via iPhone
    需要良好的命名习惯和 docstring

    写脚本迅速解决问题 跟 工程化应用 场景完全不一样
    metorm
        35
    metorm  
    OP
       2018-08-05 13:53:01 +08:00 via Android
    @q397064399 以后不这么搞了。这次这样搞是因为以前学 Python 时把一个很复杂的基础方程组写在 Python 里面了,懒得改……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5525 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:22 PVG 15:22 LAX 00:22 JFK 03:22
    Do have faith in what you're doing.
    ubao 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