写的是一个简单的物理仿真计算程序。这算好习惯还是坏习惯? 养成这个习惯是因为有一次被 numpy 的 1x1 数组坑了好久……
![]() | 1 orangeade 2018-08-04 11:27:04 +08:00 用 python 3.7 |
2 013231 2018-08-04 11:28:51 +08:00 typing 不行吗? |
3 013231 2018-08-04 11:29:04 +08:00 |
5 Em5O7B1JGfjQnBry 2018-08-04 12:08:39 +08:00 via Android 3.5 之后,可以用 type hint,然后在运行前,用 mypy 检查一遍 |
![]() | 6 xrlin 2018-08-04 12:15:18 +08:00 没办法,动态类型就是这样,动态类型是把双刃剑。 |
![]() | 7 xrlin 2018-08-04 12:16:31 +08:00 我一般用 python 写比较大一点的项目,会加上简单类型说明和比较详细的 docstring。 |
![]() | 8 metorm OP @013231 之前只是耳闻。刚才看了一下你发的链接,感觉这个手段入侵性有点强,后面顶不住了再考虑吧…… |
9 lihongjie0209 2018-08-04 12:27:31 +08:00 正常操作, 动态语言都这样. 现在又在加 typing 啊什么的, 我 TM 都写类型了,我为什么不用静态语言, 而且这个 typing 还不能保证编译安全, 鸡肋一个 |
10 asdf123101 2018-08-04 12:39:11 +08:00 via Android 动态语言就是这样的呀,不要用静态的思路去考量动态语言。用动态语言的意义不就是先把应用做出来,把结果跑出来吗。要性能和安全的时候再用 Java,C++就好了。 |
11 karllynn 2018-08-04 12:40:32 +08:00 这样会很慢啊…输入输出要按契约编程,写在 docstring 里就可以了 |
12 skinny 2018-08-04 12:42:29 +08:00 @lihongjie0209 确实如此,特别是复杂一点的类型还要写一坨代码,唯一有点用的地方是对 IDE 解析友好,代码提示更清晰准确。如果真的非常追求静态类型检查,真的不必用这种方法,换一种语言更好,比如 C#。 |
13 lihongjie0209 2018-08-04 12:44:47 +08:00 @skinny #12 动态语言的代码提示基本为 0, 写代码 10 分钟, 查手册看参数和返回值半小时 |
14 blacklee 2018-08-04 12:45:02 +08:00 via iPhone 没事,我写 ruby 也是这样。 |
![]() | 15 zhuangzhuang1988 2018-08-04 12:45:15 +08:00 来用 F#吧 爽歪歪。 |
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 语言相比有什么劣势. 脚本语言的命, 别操着静态工程语言的心. |
![]() | 17 Trim21 2018-08-04 12:56:49 +08:00 via Android @lihongjie0209 用了 typing 之后 pycharm 的自动补全还是挺爽的,如果库作者相应的 doc string 里写明了参数类型和返回值也能进行类似的参数推导 |
18 lihongjie0209 2018-08-04 13:01:29 +08:00 @Trim21 #17 给你返回一个 map, tuple 你怎么做自动补全, 怎么知道返回值中到底有什么? Python 的问题是脚本语言的灵活性给程序员带来了偷懒的机会, 返回 map 最简单, 但是后续的维护太难做. |
![]() | 19 orangeade 2018-08-04 13:13:56 +08:00 @lihongjie0209 #9 你 Java 干嘛加 var 类型推导呢 好好地手写不就行了 |
![]() | 20 fancyhan 2018-08-04 13:18:08 +08:00 如果做科学计算,还是 fall fast 比较好,我觉得可以 |
![]() | 21 Trim21 2018-08-04 13:19:30 +08:00 via Android @lihongjie0209 map 是最难受的,找不到一个办法能标注自己到底有哪些 key,看了 typing 的文档里也没有… |
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 还是具体类型, 我是一点都关心 |
23 lihongjie0209 2018-08-04 13:28:01 +08:00 @Trim21 #21 我之前写个脚本都快被搞崩溃了, 更别说大项目中使用 map 了, Java 好一点, 大家都会定义一个类, 也不是强制要求,但是大部分编码规范是这样的 |
24 Cbdy 2018-08-04 13:49:51 +08:00 via Android ![]() 随着各类程序设计工具的完善,动态语言引以为傲的简洁与动态性的优势渐渐消失,甚至在大多数时候成为鸡肋。容易注意到,现在流行的新语言都拥有静态类型系统,而早年流行的动态语言,也渐渐加上了静态类型的帽子(或方言),以便分析工具进行静态分析,把错误消除在编程阶段 |
25 Raymon111111 2018-08-04 14:06:06 +08:00 动态类型语言只能写小东西 大一点查问题查死你 |
26 justdoit123 2018-08-04 16:23:14 +08:00 via iPhone 借用王垠的一句话:“竟然还有五头的人” |
27 justdoit123 2018-08-04 16:23:34 +08:00 via iPhone 无 |
28 copie 2018-08-05 01:26:43 +08:00 via Android Python 的思想不应该是能运行 Python 解释器会想一切办法运行,不能运行就抛出异常。在代码里面放太多的类型检查会导致代码异味。 |
29 lolizeppelin 2018-08-05 03:00:15 +08:00 via Android 我觉得是你结构设计问题 openstack 那么大项目都没这么搞 一般的克通用的函数检查接口用装饰器就完了 |
![]() | 30 janxin 2018-08-05 08:19:32 +08:00 |
![]() | 31 q397064399 2018-08-05 09:34:40 +08:00 定位不清晰啊,老铁,Python 的定位就是 灵活 脚本,把它该干好的事情 干好就行了 老想着用一门语言 解决所有问题 ,不是傻就是蠢 |
![]() | 32 tohearts 2018-08-05 10:57:33 +08:00 31 楼老哥说的对 |
33 lrxiao 2018-08-05 10:59:06 +08:00 mypy 这种检查一遍项目 |
34 PythonAnswer 2018-08-05 11:58:18 +08:00 via iPhone 需要良好的命名习惯和 docstring 写脚本迅速解决问题 跟 工程化应用 场景完全不一样 |
![]() | 35 metorm OP @q397064399 以后不这么搞了。这次这样搞是因为以前学 Python 时把一个很复杂的基础方程组写在 Python 里面了,懒得改…… |