Python 3 允许混用空格和制表符?
Python 3 allows mixing spaces and tabs?
我知道有很多关于制表符和空格的问题,但似乎与 PEP 0008 关于 Python 3 的说法相反,混用制表符和空格并不总是非法的。具体来说,在同一块中混用制表符和空格是非法的,但在同一文件中允许包含空格的块和包含制表符的块。
例如,这会在 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 在同一文件中允许制表符和空格是否是设计使然。
Python 尝试将每个小代码块分段,这样当您复制和粘贴时,它仍然有效,并且您不会被迫让一切都变得完美。 python.
众多美女之一
PEP 8 只是最易读代码的约定,我建议您遵循它,但您不必必须
如果您想了解 PEP 8 包含的内容,有几个编辑器会检查您的代码是否存在 python 中合法但不友好的违规行为。我使用 PyCharm。 PyCharm 不喜欢在同一个文件中使用空格和制表符,它会因为下划线的波浪形而变得尖刻。
对此的测试非常简单 (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()
),看起来这只是将缩进类型与 previous 行,而不是整个文件中使用的内容。
文档说(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.
如果 "blocks" 完全 "separated" 返回到缩进级别 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()
从 "logic" 的角度来看没问题,因为无论我如何查看选项卡,逻辑总是很清楚。在一个文件中混用制表符和空格当然仍然是个坏主意,但这只是风格错误,而不是逻辑错误;-)
所以回答这个问题:从文档中的那一行来看,我
会说这是设计使然。不过,我找不到这个的 PEP,还有这个
案例未经测试。我不会依赖 all Python 中的版本
未来也一样!
我知道有很多关于制表符和空格的问题,但似乎与 PEP 0008 关于 Python 3 的说法相反,混用制表符和空格并不总是非法的。具体来说,在同一块中混用制表符和空格是非法的,但在同一文件中允许包含空格的块和包含制表符的块。
例如,这会在 Python 3.4:
上引发 TabErrorfor 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 在同一文件中允许制表符和空格是否是设计使然。
Python 尝试将每个小代码块分段,这样当您复制和粘贴时,它仍然有效,并且您不会被迫让一切都变得完美。 python.
众多美女之一PEP 8 只是最易读代码的约定,我建议您遵循它,但您不必必须
如果您想了解 PEP 8 包含的内容,有几个编辑器会检查您的代码是否存在 python 中合法但不友好的违规行为。我使用 PyCharm。 PyCharm 不喜欢在同一个文件中使用空格和制表符,它会因为下划线的波浪形而变得尖刻。
对此的测试非常简单 (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()
),看起来这只是将缩进类型与 previous 行,而不是整个文件中使用的内容。
文档说(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.
如果 "blocks" 完全 "separated" 返回到缩进级别 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()
从 "logic" 的角度来看没问题,因为无论我如何查看选项卡,逻辑总是很清楚。在一个文件中混用制表符和空格当然仍然是个坏主意,但这只是风格错误,而不是逻辑错误;-)
所以回答这个问题:从文档中的那一行来看,我 会说这是设计使然。不过,我找不到这个的 PEP,还有这个 案例未经测试。我不会依赖 all Python 中的版本 未来也一样!