Chen Yangjian's Blog

Carpe diem - Seize the day

代码缩进风格

| Comments

Python 和 Haskell 作为编程语言中异类,使用缩进作为代码块的标注,Haskell 还好些,同时也提供了花括号({,braces),Python 则一路牛鼻到底,不仅现在不支持,还很负责任地说:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import braces
  File "", line 1
SyntaxError: **not a chance**
>>>

99% 的时候,习惯了这种方式也就好了,有的时候还会爱上它。但是当你不小心在 Emacs 里头按了 C-x h C-M-\ (选择所有,自动缩进)或者在 Eclipse 里头按了 C-a C-Shift-f (我不知道会不会有人用 Eclipse 写 Python),并以为代码已然缩进,万事大吉,那你的人生就变成了茶几——充满了杯具了…… 因为 IDE 根本不可能知道下面这个该如何缩进:

if i_can_have_braces:
    hooray()
    lets_throw_a_party() #这个得丢到哪里?该不该缩进?

在 Emacs python-mode 的文档里头,也有相似的警告。

同样的,在其他 C 语言风格的编程语言里头,裸露的条件语句也是很危险的,比如:

if (you_should_use_braces)
    hell_no({reason: "time is precious. can't be wasted on typing redundant characters"});
    lets_throw_a_party_anyway();    // 即使缩紧了,也木有用……

所以,大部分情况下,还是用上花括号的好,实在想偷懒,不要换行,直接跟到 if 后面。

而又说到花括号,开括号的位置也是个热门讨论话题。K&R 的态度是(我深以为然):

The position of braces is less important, although people hold passionate beliefs. We have chosen one of several popular styles. Pick a style that suits you, then use it consistently.

花括号的位置并不重要,然而人们总是坚持自己所信奉的。我们在几个流行的风格中做出了选择。你只要选一个自己中意的,然后一直用下去就行了。

Python 的解决方式简单,那我就干脆不用,到此为止。Java 呢,提倡 The One True Brace Style,1TBS,即所有的开括号都丢到语句末尾,而不是另起一行。像这样:

    if (x < 0) {
        printf("Negative");
        negative(x);
    } else {
        printf("Positive");
        positive(x);
    }

我用的是这个。

一点点题外话:中午的时候花了点时间,想在 Emacs 里头 Python-mode 时,禁用掉区域缩进,免得哪天昏了头造成不必要的后果,但是找不到 python-mode-map 变量,去翻 python-mode.el 的时候,发现叫做 py-mode-map,可是也找不到,总之很囧……

(add-hook 'python-mode-hook
      (lambda ()
        (define-key py-mode-map (kbd "C-M-\\") (message "not a chance"))
        ))

本来,加上这个也就大功告成了的……

Comments