写的是一个简单的物理仿真计算程序。这算好习惯还是坏习惯? 养成这个习惯是因为有一次被 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 3
随着各类程序设计工具的完善,动态语言引以为傲的简洁与动态性的优势渐渐消失,甚至在大多数时候成为鸡肋。容易注意到,现在流行的新语言都拥有静态类型系统,而早年流行的动态语言,也渐渐加上了静态类型的帽子(或方言),以便分析工具进行静态分析,把错误消除在编程阶段
|
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 里面了,懒得改……
|