推荐学习书目
› 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 · Aug 4, 2018 via Android · 7222 views
    This topic created in 3020 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    脚本语言的命, 别操着静态工程语言的心.
    Trim21
    Trim21
    Aug 4, 2018 via Android
    17
    @lihongjie0209 用了 typing 之后 pycharm 的自动补全还是挺爽的,如果库作者相应的 doc string 里写明了参数类型和返回值也能进行类似的参数推导
    lihongjie0209
    lihongjie0209
    Aug 4, 2018
    18
    @Trim21 #17 给你返回一个 map, tuple 你怎么做自动补全, 怎么知道返回值中到底有什么? Python 的问题是脚本语言的灵活性给程序员带来了偷懒的机会, 返回 map 最简单, 但是后续的维护太难做.
    orangeade
    orangeade
    Aug 4, 2018
    19
    @lihongjie0209 #9 你 Java 干嘛加 var 类型推导呢 好好地手写不就行了
    fancyhan
    fancyhan
    Aug 4, 2018
    20
    如果做科学计算,还是 fall fast 比较好,我觉得可以
    Trim21
    Trim21
    Aug 4, 2018 via Android
    21
    @lihongjie0209 map 是最难受的,找不到一个办法能标注自己到底有哪些 key,看了 typing 的文档里也没有…
    lihongjie0209
    lihongjie0209
    Aug 4, 2018
    22
    @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
    lihongjie0209
    Aug 4, 2018
    23
    @Trim21 #21 我之前写个脚本都快被搞崩溃了, 更别说大项目中使用 map 了, Java 好一点, 大家都会定义一个类, 也不是强制要求,但是大部分编码规范是这样的
    Cbdy
    Cbdy
    Aug 4, 2018 via Android❤️3
    24
    随着各类程序设计工具的完善,动态语言引以为傲的简洁与动态性的优势渐渐消失,甚至在大多数时候成为鸡肋。容易注意到,现在流行的新语言都拥有静态类型系统,而早年流行的动态语言,也渐渐加上了静态类型的帽子(或方言),以便分析工具进行静态分析,把错误消除在编程阶段
    Raymon111111
    Raymon111111
    Aug 4, 2018
    25
    动态类型语言只能写小东西

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

    openstack 那么大项目都没这么搞


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

    写脚本迅速解决问题 跟 工程化应用 场景完全不一样
    metorm
    metorm
    OP
    Aug 5, 2018 via Android
    35
    @q397064399 以后不这么搞了。这次这样搞是因为以前学 Python 时把一个很复杂的基础方程组写在 Python 里面了,懒得改……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   932 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    ♥ Do have faith in what you're doing.