портирование синтаксиса Python 2 на Python 3 - PullRequest
0 голосов
/ 15 октября 2011

Я пытаюсь запустить следующий код в 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 Ответ

6 голосов
/ 15 октября 2011

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

Единственный способ сделать так, чтобы отступы выглядели странно, если вы установите для табуляции больше , чем восемь пробелов, и тогда отступ не только выглядит явно неправильным, вы ' Вы заметите, что вкладка будет иметь отступ в 12 пробелов (в приведенном ниже примере), поэтому вы понимаете, что вставляете вкладку, а не четыре пробела.

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

Конечно, решение всех ваших проблем, как написано в комментариях, никогда не использовать вкладки. Я не уверен, почему в Python 3 по-прежнему разрешены вкладки, на самом деле нет веских причин для этого.

...