理解Python解释器-t (-tt)选项
我想弄清楚选项 -t 和 -tt 的作用。
根据文档:
当源文件在缩进时混合使用制表符和空格,并且这种混合方式使得缩进依赖于一个制表符用空格表示的宽度时,会发出警告。如果选项给了两次 (-tt),则会发出错误。
我不太明白,特别是加粗的那句话,这是什么意思?制表符就是制表符('\t'),空格就是空格(' '),在 ASCII 表中它们也有两个不同的编码。
我试着举个例子来更好地解释我自己。我写了:
if True:
print('hello') # here a tab that my editor represents with 4 spaces
print('world') # here just used 4 spaces
现在这段代码,我试过了,在 Python3 和 Python2 中都不工作,那 -t 是干什么的呢?
你能给我解释一下吗?
2 个回答
当一个源文件依赖于制表符(Tab)被扩展成特定数量的空格时,就会出现这个错误。
比如,下面这样的文件就会有问题:
def function():
print 'hello'
\tprint 'goodbye'
如果一个制表符等于4个空格,上面的代码是可以正常工作的,但如果制表符的空格数不是4,就会出错(除了0,这个情况是没意义的)。
使用 -t
这个选项可以帮助找出这些问题。
在代码缩进时,制表符(tab)需要被理解为相当于一定数量的空格。具体有多少个空格,取决于你编辑器的设置,以及同一行中制表符前面有多少个空格。这是因为制表符表示“跳到下一个制表位”。如果你在一行中用了2个空格加一个制表符,那就相当于跳到了第8列,就像你插入了6个空格一样。
另外,有些人把制表位设置为4个空格的宽度,有些人则设置为8个空格的宽度。这些人使用制表符进行缩进的方式也会有所不同。你可以用4个空格表示一个缩进层级,然后在下一个层级用8个空格的制表符,再然后用一个制表符加4个空格,等等。或者你可以在所有缩进层级中都使用制表符,只要把制表符的大小设置为4个空格的宽度。
Python需要处理制表符和空格混合使用的情况,并希望你能保持一致;比如说,你没有先用4个空格,然后再用一个制表符来缩进到你认为相当于12个空格的位置。如果你不一致,Python很容易就会出错。
-t
和-tt
选项会通过对所有行进行更严格的测试,指出你可能出错的地方。
由于不同的制表符大小和混合使用制表符与空格可能导致混淆的结果,这也是为什么Python风格指南(PEP 8)强烈建议你只使用空格进行缩进的原因:
空格是首选的缩进方式。
制表符应该仅用于与已经用制表符缩进的代码保持一致。
在Python 3中,混合使用制表符和空格进行缩进现在会被视为错误。
具体来说:Python默认假设一个制表符等于8个空格。请参阅缩进文档,这是词法分析规范的一部分:
首先,制表符会从左到右被替换为1到8个空格,使得替换后的总字符数是8的倍数(这与Unix使用的规则相同)。然后,第一非空字符前面的空格总数决定了这一行的缩进。缩进不能通过反斜杠在多行中分割;到第一个反斜杠之前的空白部分决定了缩进。
Python 2还会查找Emacs和VI风格的配置注释;如果分词器发现注释中有tab-width:
、:tabstop=
、:ts=
或set tabsize=
,后面跟着数字,比如:
# -*- tab-width: 4 -*- (emacs)
# :tabstop=4 (vi)
或者类似的变体,那么Python会根据这个设置制表符的大小。这项支持在Python 3中被移除了。
如果你混合使用了可能不一致的制表符和空格,并且使用了-t
,那么文本<filename>: inconsistent use of tabs and spaces in indentation
会被写入sys.stderr
,只针对该文件。如果你使用-tt
,则会引发一个TabError
异常。