关于 Python 强制缩进的梗

2019-02-06 03:46:22 +08:00
 largecat
有些帖子吐槽 python 的缩进梗,特别提到一些大规模代码修改时候的痛苦。

我觉得写这个帖子的人估计是没有研究过祖传代码。
这个维护不是你找女朋友,床的时候只图做的时候爽,拍拍屁股走人,你还得考虑后续的责任问题。
我觉得吧,做的人自己改一下代码可能容易,虽然花点时间,但是这为后面阅读的人节省了大量的时间。

自由格式的代码改起来是快,任意插入代码不用花时间调整缩进,但是后面阅读的人就懵逼了。
你加结束码的时候应该体会一下后面数结束码的人的感受。
7535 次点击
所在节点    程序员
45 条回复
largecat
2019-02-06 11:34:22 +08:00
9hills
2019-02-06 11:36:22 +08:00
@notreami 任何语言一个函数八百行,都是不及格的
lihongjie0209
2019-02-06 11:39:35 +08:00
@largecat 那个任何非 tab 的语言都可以一个快捷键马上就可以工整优雅
pkookp8
2019-02-06 11:47:59 +08:00
@0xABCD
if a:
print 1
print 2
怎么区分 print 2 在 if 里还是 if 外,所以我的理解是因为这种原因,一直没有类 gofmt 的工具。go 有括号,没有歧义
luozic
2019-02-06 11:59:00 +08:00
除非是小项目,大项目大部分时间在看代码,写个锤子
LokiSharp
2019-02-06 13:00:29 +08:00
写什么代码不缩进都是烂代码啊
dacapoday
2019-02-06 13:04:35 +08:00
这就是最佳实践变成规范的情况,然而有些人不认可缩进是最佳实践,甚至以代码不可读为荣。
FrankHB
2019-02-06 15:26:40 +08:00
@momocraft 可能因为设计这些玩意儿的比较业余吧。

Block 这玩意儿跟缩进本来就没什么关系。虽然一开始发明 block 的( ALGOL )大概还清楚是个什么玩意儿,后面就莫名其妙成了祖传视觉艺术了。

……并且就算 free form 也未必干净。例如,考虑以下 C 艹:
xxxxxx;
{
SomeGuard guard;
}
xxxxx;
哪天有个菜 13 随便手贱把 block 去了,整坨代码可能就炸了……

而像样点的设计呢……

https://en.wikipedia.org/wiki/Let_expression

这还不如直接多个关键字清楚呢。(虽然被 BASIC 搞臭了不少。)
FrankHB
2019-02-06 15:46:57 +08:00
@9hills 八百行是确数么。
那么请试着改正这段代码使之合格: https://github.com/gcc-mirror/gcc/blob/master/gcc/c/c-decl.c#L5802
@dacapoday 你确定缩进是最佳实践?代码总是给人读的?
随便定位到不同部分,看看要符合你的断言得有什么条件: https://coding.net/u/dntc/p/videoconverter.js/git/raw/master/build/ffmpeg.js
ywgx
2019-02-06 16:01:29 +08:00
[JUNK REMOVED]
aijam
2019-02-06 16:07:31 +08:00
@livid #30 恶意代码
FrankHB
2019-02-06 16:10:01 +08:00
顺便,要是某几个最佳实践真的有对外宣传得那么清楚的话,就压根不用这货里面的其中一大坨复读了:
https://www.python.org/dev/peps/pep-0008

题外话,想要打起来的话,缩进本身相比其中的具体问题其实是排不上号了。这里面就不止一坨:
https://stackoverflow.com/questions/120926/why-does-python-pep-8-strongly-recommend-spaces-over-tabs-for-indentation

PEP-8 钦定的规则实际上还不就是所谓多数票暴政拣软柿子捏嘛,还搞出来光标随便一定位就可能有“半个缩进”的不合逻辑的问题……真搞什么最佳事件,敢强行统一么。

另外,洗 Go 的也别高兴太早。老实说 Go 强制 OTBS 逻辑上也挺蠢的:凭什么}那么脸大占一行{就不行?要省地方为什么不}}}}}?
momocraft
2019-02-06 16:24:47 +08:00
这个设计中语法结构信息 *仅* 存在于缩进那几个空格里,因此一个 "正确" 的 pyfmt 也许不可能实现(一个程序要像人一样理解代码才能知道“应该”加几个空格)

也许作者想的是... 强迫人类手打空格能防止粘贴代码导致火箭发射失败
AX5N
2019-02-06 20:01:15 +08:00
我很喜欢强制缩进这个设计思路。
xabc
2019-02-06 20:33:10 +08:00
@ywgx 账号刚才发了一个 curl xabc.io/tips | bash 的回复; 而实际上我的本意是 curl xabc.io/tips ,习惯日常工具使用了,多加了一个 | bash , 而我个人经常需要改缩进问题,而经常忘记这个 tips 所以做成这个简便方案, curl xabc.io/tips 可以看看输出前面几行, 而下面的几行多余代码, 可以看看 也是我个人的日常快捷记录
```
TAB 替换为空格:
:se ts=4
:se et
:%retab!
空格替换为 TAB:
:se ts=4
:se noet
:%retab!
```

@aijam 请问恶意代码在哪里? 能不能别动不动恶意的揣测别人的友好回复提醒?
@livid 站长,你是否动过自己的脑筋?确认我这是恶意代码吗? 可以让大家看看恶意在哪里?
xabc
2019-02-06 20:37:04 +08:00
curl xabc.io/ tips 的全部输出内容如下, 前面一段是 对 tab 和 空格记录的说明, 下面的是一个 nginx 配置的快捷记录, 下面两个 iptables 是我日常 封闭恶意挖矿代码的时候,自己的记录, 下面几个 sql 域名,也是我自己快捷记录,这是恶意代码吗? 大过年的能不能别这么敏感嘛 😄

TAB 替换为空格:
:se ts=4
:se et
:%retab!
空格替换为 TAB:
:se ts=4
:se noet
:%retab!
return 301 https://$host$request_uri;
*/5 * * * * ps aux|grep nginx|grep -v grep||/opt/openresty/nginx/sbin/nginx
iptables -A INPUT -s xmr.crypto-pool.fr -j DROP
iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP
use mysql;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;
se et ts=4 sts=8 sw=4
Taojun0714
2019-02-06 21:25:45 +08:00
@aijam 9102 年了,还有人没把 tab 自动设置成四个空格,也是好玩
CloudnuY
2019-02-07 00:09:46 +08:00
“自由格式的代码改起来是快,任意插入代码不用花时间调整缩进,但是后面阅读的人就懵逼了。
你加结束码的时候应该体会一下后面数结束码的人的感受。”

--------------------------
9102 年了还在吐槽这?
lynskylate
2019-02-07 00:15:30 +08:00
9102 年了吐槽 python 缩进真是太搞笑了。还有过多缩进是坏代码的重要味道提现
aijam
2019-02-07 05:38:57 +08:00
@Taojun0714 少见多怪了不是,golang 的 indent 了解下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/533157

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX