将Python 2语法移植到Python 3

时间:2011-10-15 02:56:37

标签: python python-3.x python-2.x

我正在尝试在python3中运行以下代码,但它已被编写为我非常肯定python2:

f = open(filename, 'r')
self.lines = f.readlines()
f.close()
if self.lines[-1] != "\n" :
    self.lines.append("\n")

但我收到以下错误:

  File "randline.py", line 32
    if self.lines[-1] != "\n" :
                              ^
TabError: inconsistent use of tabs and spaces in indentation

你能帮我弄清楚正确的语法吗?

1 个答案:

答案 0 :(得分:6)

Python 2允许您混合空格和制表符。所以你可以像:

那样缩进
def foo():
[this is a tab it counts like eight spaces             ]for each in range(5):
[this is a tab it counts like eight spaces             ][space][space]print(each)
[space][space][space][space][space][space][space][space]print("Done!")

第2行和第4行将在Python 2中具有相同的缩进级别,但第2行将使用制表符执行,第4行将使用空格。打印到控制台,它将如下所示:

def foo()
        for each in range(5):
          print(5)
        print("Done!")

但是大多数编辑器允许您设置选项卡应该有多少空格。将它设置为四,你得到这个:

def foo()
    for each in range(5):
      print(5)
        print("Done!")

缩进仍然相同,但现在看起来缩进是错误的

因此,Python 3不允许以不同方式缩进相同的缩进级别(即第2行和第4行)。您仍然可以混合制表符和空格,但不能在同一缩进级别。这意味着

def foo():
[this is a tab it counts like eight spaces             ]for each in range(5):
[this is a tab it counts like eight spaces             ][space][space]print(each)
[this is a tab it counts like eight spaces             ]print("Done!")

会起作用,

也会如此
def foo():
[this is a tab it counts like eight spaces             ]for each in range(5):
[space][space][space][space][space][space][space][space][space][space]print(each)
[this is a tab it counts like eight spaces             ]print("Done!")

唯一可以使缩进看起来很奇怪的方法是将标签设置为 more 而不是八个空格,然后缩进不仅看起来明显不正确,我们会注意到一个标签将缩进12个空格(在下面的示例中),因此您意识到您插入了一个标签,而不是四个空格。

def foo():
            for each in range(5):
          print(each)
            print("Done!")

当然,所有问题的解决方案都是在评论中写的,从不使用标签。我不确定为什么Python 3仍然允许使用标签,没有充分的理由,真的。