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 · 5938 次点击
    这是一个创建于 2338 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写的是一个简单的物理仿真计算程序。这算好习惯还是坏习惯? 养成这个习惯是因为有一次被 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
    wwqgtxx  
       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   ·   实用小工具   ·   2817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:30 · PVG 11:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.