我知道标签与空格有很多问题,但看起来,与{3}}关于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是否允许在同一文件中使用制表符和空格。
答案 0 :(得分:5)
对此的测试非常简单(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
,强调我的)
如果源文件混合制表符和空格,其含义取决于空格中制表符的价值,则会拒绝缩进为不一致;在这种情况下会引发
TabError
。
如果&#34;阻止&#34;混合制表符和空格是可以的。完全&#34;分开&#34;通过回到缩进级别0;因为标签宽度设置不会混淆程序的逻辑。在Python中混合制表符和空格的问题是Python 假设一个制表符是八个空格宽,但程序员的编辑器可能会使用其他东西。例如,代码如下:
def my_fun(i):
if i == 6:
foo()
------->bar() # Tab
将被视为具有4的tabstop:
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()
从一个&#34;逻辑&#34;它可以。观点,无论我如何查看标签,它总是清楚逻辑是什么。当然仍然在单个文件中混合制表符和空格是一个坏主意,但这只是一个风格错误,而不是逻辑错误; - )
所以回答这个问题:从文档中的那一行来看,我 会说这是设计的。但是,我无法为此找到PEP 案件未经过测试。我不会依赖于所有 Python版本 未来表现一样!
答案 1 :(得分:1)
Python试图对每个代码块进行细分,这样当你复制和粘贴时,它仍然可以工作,而且你不会被迫使一切都完美无缺。 python的众多美女之一。
PEP 8只是最易读的代码的惯例,我建议你遵循它,但你不必须
如果你想查找PEP 8所包含的内容,有几个编辑器会检查你的代码是否存在python中合法的违规行为,但不是很好。我用PyCharm。当你在同一个文件中使用空格和制表符时,PyCharm不喜欢它,并且它会因为波浪形的衬里而变得松散。