将Python 2语法移植到Python 3

Shu*_*ham 0 python python-2.x python-3.x

我试图在python3中运行以下代码,但它已经编写,我很确定python2:

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

但是我收到以下错误:

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

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

Len*_*bro 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!")
Run Code Online (Sandbox Code Playgroud)

Python 2中的第2行和第4行将具有相同的缩进级别,但第2行将使用制表符执行,第4行将使用空格.打印到控制台,它看起来像这样:

def foo()
        for each in range(5):
          print(5)
        print("Done!")
Run Code Online (Sandbox Code Playgroud)

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

def foo()
    for each in range(5):
      print(5)
        print("Done!")
Run Code Online (Sandbox Code Playgroud)

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

因此,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!")
Run Code Online (Sandbox Code Playgroud)

会工作,也会这样

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!")
Run Code Online (Sandbox Code Playgroud)

只有这样,才能让你可以使缩进看起来很怪异的唯一方法就是你设置成标签要比8个空格,然后压痕不仅看起来显然是不正确,你会发现一个标签将缩进12位(在下面的示例中),因此您意识到插入了一个选项卡,而不是四个空格.

def foo():
            for each in range(5):
          print(each)
            print("Done!")
Run Code Online (Sandbox Code Playgroud)

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