我知道有很多关于制表符和空格的问题,但似乎与PEP 0008相反说到 Python 3,混合制表符和空格并不总是非法的。具体来说,在同一 block 中混用制表符和空格是非法的,但在同一文件中允许包含空格的 block 和包含制表符的 block 。
例如,这会在 Python 3.4 上抛出一个 TabError:
for x in range(10):
print(x) # Spaces
print(x) # Tab
但这运行正常:
for x in range(10):
print(x) # Spaces
for y in range(5):
print(y) # Tab
这是设计使然吗?
编辑:问题是不是制表符是否比空格好。问题是 Python 在同一文件中允许使用制表符和空格是否是设计使然。
最佳答案
对此的测试非常简单(Lib/tests/test_exceptions.py
):
self.raise_catch(TabError, "TabError") try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '<string>', 'exec') except TabError: pass else: self.fail("TabError not raised")
查看实际抛出此错误的代码(Parser/tokenizer.c
、tok_get()
),看起来这只是将缩进类型与使用了 前 行,而不是整个文件中使用的行。
文档说(Doc/reference/lexical_analysis.rst
,强调我的)
Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a
TabError
is raised in that case.
如果“ block ”通过返回到缩进级别 0 完全“分隔”,则可以混合制表符和空格;因为制表符宽度设置不会混淆程序的逻辑。在 Python 中混用制表符和空格的问题在于 Python 假定制表符的宽度为八个空格,但程序员的编辑器可能会使用其他内容。例如,这样的代码:
def my_fun(i):
if i == 6:
foo()
------->bar() # Tab
将被视为带有 4 个制表位的:
def my_fun(i):
if i == 6:
foo()
bar()
这显然不是程序的作用!
但是在这样的情况下:
def my_fun(i):
if i == 6:
foo()
bar()
def my_fun2(i):
--->if i == 7:
--->--->foo()
--->--->bar()
从“逻辑”的角度来看,这没问题,因为无论我如何查看选项卡,逻辑总是很清楚。在单个文件中混合制表符和空格当然仍然是个坏主意,但这只是风格错误,而不是逻辑错误;-)
所以回答这个问题:从文档中的那一行来看,我 会说这是设计使然。不过,我找不到这个的 PEP,还有这个 案例未经测试。我不会依赖于 所有 Python 版本 future 也一样!
关于Python 3 允许混合使用空格和制表符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36063679/