【问题标题】:porting Python 2 syntax to Python 3将 Python 2 语法移植到 Python 3
【发布时间】:2011-10-15 02:56:36
【问题描述】:

我正在尝试在 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

你能帮我找出正确的语法吗?

【问题讨论】:

  • 在你的编辑器中使用 show whitespace
  • 删除所有标签。使用 4 个空格
  • 感谢您解决了我的问题。添加您的评论作为答案,所以我赞成并接受! :)

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


【解决方案1】:

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!")

但大多数编辑器都允许您设置制表符应该有多少个空格。将其设置为 4,您将得到:

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!")

使缩进看起来怪异的唯一方法是将制表符设置为更多超过八个空格,然后缩进不仅看起来明显不正确,而且'会注意到一个制表符将缩进 12 个空格(在下面的示例中),因此您意识到您插入的是一个制表符,而不是四个空格。

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

当然,所有问题的解决方案都写在 cmets 中,永远不要使用制表符。我不确定为什么 Python 3 仍然允许选项卡,真的没有很好的理由。

【讨论】:

  • 很棒的文章,直到最后一个(巨魔诱饵)条款。选项卡有很多很好的理由,例如以比例宽度字体编码,或与其他语言保持一致,或将单个字符映射到构造,或者在不将 four spaces as indent 视为单个构造的编辑器中更容易编辑.还有其他原因,这就是为什么这个话题争论了这么久,以及为什么我仍然在标签中编码,即使我承认 Python 已经航行了。
  • 另外,今天我了解到 Python 3 确实允许在文件中混合制表符和空格,只是不允许在给定块中混合(正如您所说的正确)。
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多