«Неправильное использование табуляции и пробелов в отступе»

223

Я пытаюсь создать приложение в Python 3.2 и все время использую вкладки для отступа, но даже редактор меняет некоторые из них на пробелы, а затем выдает «непоследовательное использование вкладок и пробелов в отступе» при попытке запустить программа.

Как я могу изменить пробелы на вкладки? Это сводит меня с ума. (Я новичок в программировании). Я был бы рад, если бы я мог получить некоторые общие советы по своему коду, если бы я сделал много ошибок, я был бы рад услышать.

import random

attraktioner = ["frittfall","bergodalbana","spökhuset"]


class Nojesfalt:
    def __init__(self, attraktion):
        self.val = attraktion
        self.langd = 0
        self.alder = 0


#längdgräns för fritt fall
    def langdgrans(self):
        print("")
        self.langd = int(input("Hur lång är du i cm? "))
        if self.langd < 140:
            print("tyvärr, du är för kort, prova något annat")
            return 0
        elif self.langd >= 140:
            print("håll dig hatten, nu åker vi!")
            print(" ")
            return 1

#åldersgräns för spökhuset
    def aldersgrans(self):
        print("")
        self.alder = int(input("Hur gammal är du? "))
        if self.alder < 10:
            print("tyvärr, du är för ung, prova något annat")
            return 0
        elif self.alder >= 10:
            print("Gå in om du törs!")
            print(" ")
            return 1


#åker attraktion frittfall lr bergodalbana
        def aka(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("åkturen gick åt skogen, bättre lycka nästa gång")
        elif tal >= 20:
            print("jabbadabbbadoooooooo")
            return 1

#går i spökhuset
        def aka1(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("du är omringad av spöken och kan inte fortsätta")            return 0
        elif tal >= 20:
            print("Buhuuuuuu, buuuhuuuu")
            return 1

#programkod
print("Välkommen till nöjesfältet, vad vill du göra?")
print(" ")

while 1:
    vald_attr = input("Vad vill du göra?\n1. frittfall\n2. bergodalbana\n3. spökhuset\n4. Avsluta\n")
    if vald_attr == "1":
        val = Nojesfalt(attraktioner[0])
        if val.langdgrans() == 1:
            val.aka()
    elif vald_attr == "2":
        val = Nojesfalt(attraktioner[1])
        val.aka()
    elif vald_attr == "3":
        val = Nojesfalt(attraktioner[2])
        if val.aldersgrans() == 1:
            val.aka1()
    elif vald_attr == "4":
        break
Юлия Леркерт
источник
27
Это проблема с вашим редактором кода, а не с Python. Вы должны изменить свой вопрос, чтобы отразить это, и указать, какой редактор вы используете.
Джефф Меркадо
3
Как вы это измените, зависит от вашего редактора. Я не уверен, что это даже по теме здесь, это может быть вопрос для суперпользователя.
Леннарт Регебро
Измените ваш редактор, чтобы показать видимые пробелы в начале строки. Например, я настроил мой редактор для отображения прозрачных вкладок и видимых пространств, потому что я использую вкладки для отступа кода. Если я вижу шум в начале строки, я знаю, что есть один или несколько лишних пробелов. Если вы настаиваете на том, чтобы делать это неправильно, вы можете настроить свой редактор, чтобы скрывать пробелы и показывать вкладки. (Да, я знаю о PEP-8, но я не согласен с этим.)
Микко Ранталайнен

Ответы:

277

Не используйте вкладки.

  1. Установите ваш редактор, чтобы использовать 4 пробела для отступа.
  2. Сделайте поиск и замените, чтобы заменить все вкладки с 4 пробелами.
  3. Убедитесь, что ваш редактор настроен для отображения вкладок в виде 8 пробелов.

Примечание: причина для 8 пробелов для вкладок заключается в том, что вы сразу же замечаете, что вкладки были вставлены непреднамеренно - например, при копировании и вставке из примера кода, в котором вместо пробелов используются вкладки.

Леннарт Регебро
источник
7
Есть ли какие-то рассуждения за этими догмами?
RocketR
1
@ Леннарт Регебро, я имею в виду использование пробелов вообще. Я использую их, но неосознанно вкладки кажутся мне лучше. Кстати, в программировании на Ruby каждый использует 2 пробела, так что это не одно правило для всех.
RocketR
3
@RocketR: ответ для Python. Если вы используете только вкладки, вы получаете отступ с 8 пробелами, если только вы не расширили вкладки до значений, превышающих 8 пробелов, в этом случае это будет выглядеть плохо в других редакторах. Если вы смешиваете табуляцию и пробелы, она может сломаться (см. Вопрос) или выглядеть испорченной, если у вас есть расширение табуляции, отличное от 8 пробелов. В итоге: использование вкладок для отступа невероятно плохо. Никогда не делайте этого никогда (за исключением языков / форматов файлов, которые этого требуют). Конец.
Леннарт Регебро
2
@RocketR Python имеет Pep8, документ, в котором указан «хороший стиль Python», в котором явно указано, что 4 пробела - это принятая форма для отступа.
Даниэль Гратцер,
4
Ссылка на соответствующий раздел PEP 8 в спойлере «Табуляция против пробелов» : первая строка «Пробелы являются предпочтительным методом отступа».
Тадхг Макдональд-Дженсен
63

Использование autopep8команды ниже исправило это для меня:

 autopep8 -i my_file.py

Документация по autopep8 ссылке здесь.

Akavall
источник
43

С редактором IDLE вы можете использовать это:

  • Меню ПравкаВыбрать все
  • Формат меню → Untabify Region
  • Предполагая, что ваш редактор заменил 8 пробелов на вкладке, введите 8 в поле ввода.
  • Нажмите select, и он исправит весь документ.
arsb48
источник
15

Если вы используете Sublime Text для разработки на Python, вы можете избежать ошибки, используя пакет Anaconda. После установки Anaconda, откройте файл в Sublime Text, щелкните правой кнопкой мыши на открытых пространствах → выберите Anaconda → нажмите на автоформат. Готово . Или нажмите Ctrl+ Alt+ R.

Kapilfreeman
источник
12

Как правило, люди предпочитают отступать в пространстве. Это более согласованно между редакторами, что приводит к меньшему количеству несоответствий такого рода. Тем не менее, вы можете сделать отступ с вкладкой. Это твой выбор; Тем не менее, вы должны знать, что стандарт 8 пробелов на вкладку немного шире.

Что касается вашей проблемы, скорее всего, ваш редактор испорчен. Преобразование табуляции в пробел действительно зависит от редактора.

Например, в Emacs вы можете вызвать метод untabify.

В командной строке вы можете использовать sed-строку (адаптировать количество пробелов к тому, что вам нравится):

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py
Брюс
источник
9

При использовании возвышенного текстового редактора я смог выбрать сегмент моего кода, который выдавал мне inconsistent use of tabs and spaces in indentationошибку, и выбрать:

view > indentation > convert indentation to spaces

который решил проблему для меня.

Dulangi_Kanchana
источник
8

Что я сделал, когда всплыла та же ошибка: выберите все ( Str+ A) и нажмите Shift+ Tab. Так что больше ничего не отступило. Теперь вернитесь к строкам, которые вы хотите выделить, и вставьте их так, как вы хотите.

У меня это сработало ...

hccavs19
источник
7

Недавно у меня возникла та же проблема, и я обнаружил, что мне просто нужно преобразовать кодировку .py файла в UTF-8. поскольку это набор, который использует Python 3.

Кстати, я все время использовал вкладки с 4 пробелами, поэтому проблема не была вызвана ими.

Влад
источник
6

Возвышенный текст 3

В возвышенном тексте ПОКА редактирование в Python файл:

Меню Sublime Text > Настройки > Настройки - Синтаксис :

Python.sublime-настройка

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
chebaby
источник
5

Эту проблему можно решить notepad++, заменив Tabs на 4 Spaces:

  1. Выберите Поиск -> Найти ... или нажмите Ctrl+F
  2. Выберите вкладку Заменить
  3. В поле « Режим поиска» выберите « Расширенный» (\ n, \ r, \ t, \ 0, \ x ...)
  4. В поле найди что: напиши \ t
  5. В поле Заменить на: нажмите Space4 раза. Будьте уверены, что в этой области больше ничего нет.
  6. Нажмите на кнопку Заменить все

Как заменить табуляцию пробелами

Czarek
источник
3

У меня была эта проблема. Решение: ваша «вкладка» перед строкой проблемы - пробелы, 4, 6 или 8 пробелов. Вы должны стереть их и вставить вкладку. '\ Т'. Вот и все.

Gaorin
источник
При кодировании на Python вообще не рекомендуется использовать символы табуляции - читайте PEP008 ( python.org/dev/peps/pep-0008 )
Тони Саффолк 66
2

Я использую Notepad ++ и получил эту ошибку.

В Notepad ++ вы увидите, что и табуляция, и четыре пробела одинаковы, но когда вы скопируете свой код в Python IDLE, вы увидите разницу, и строка с вкладкой будет иметь больше места перед ней, чем другие.

Чтобы решить проблему, я просто удалил вкладку перед строкой, а затем добавил четыре пробела.

user3625605
источник
2

У меня была такая же ошибка. Мне пришлось добавить несколько строк кода в существующий файл * .py. В Notepad ++ это не сработало.

После добавления строк кода и сохранения я получил ту же ошибку. Когда я открыл тот же файл в PyCharm и добавил строки, ошибка исчезла.

Андрушенко Александр
источник
1

Я получил те же ошибки, но не мог понять, что я делаю неправильно.

Поэтому я исправил это, запустив авто-отступ для своего кода и позволив машине исправить мою ошибку.

Если кому интересно, как я это сделал. Просто. Зайди в vim. Введите G = GG.

Это автоматически исправит все. Удачи :)

Шаурья Капур
источник
1

Ваша проблема из-за ограничений / конфигурации вашего редактора. Некоторые редакторы предоставляют вам инструменты для решения этой проблемы:

  1. Преобразование вкладок в пробелы

    Например, если вы используете редактор Python Стани, вы можете настроить его на сохранение.

  2. Преобразование пробелов в закладки

Если вы используете ActiveState Komodo, у вас есть инструмент для «табификации» вашего кода. Как уже указывали другие, это не очень хорошая идея.

Pydev в Eclipse предоставляет функции «Преобразование вкладок в пробелы» и «Преобразование вкладок в табуляции».

Хоакин
источник
1

Если ваш редактор не распознает вкладки при выполнении поиска и замены (например, SciTE), вы можете вставить код в Word и выполнить поиск, используя Ctr-H и ^ t, который находит вкладки, которые затем можно заменить на 4 пробела.

kozowh
источник
1

Отсюда был дубликат этого вопроса, но я подумал, что могу предложить представление о современных редакторах и огромном количестве функций, которые они предлагают. В коде python все, что нужно в .pyфайле, должно быть или все, используя клавишу табуляции, или пробелами. Соглашение состоит в том, чтобы использовать четыре пробела для отступа. Большинство редакторов имеют возможность визуально показывать в редакторе, имеет ли код отступы от пробелов или табуляции, что очень помогает при отладке. Например, с атомом, перейдя в настройки, а затем редактор, вы можете увидеть следующие две опции:

редактор атомов для отображения вкладок и пробелов

Тогда, если ваш код использует пробелы, вы увидите маленькие точки, где ваш код имеет отступ:

введите описание изображения здесь

И если он отступает с помощью вкладок, вы увидите что-то вроде этого:

введите описание изображения здесь

Теперь, если вы заметили, вы можете видеть, что при использовании вкладок слева появляется больше ошибок / предупреждений, это происходит из-за того, что называется pep8, документация pep8 , которая в основном представляет собой единое руководство по стилю для python, так что все разработчики в основном пишут код тот же стандарт и внешний вид, который помогает при попытке понять код других людей, это в pep8, который способствует использованию пробелов для отступа, а не табуляции. И мы видим, что редактор показывает, что есть предупреждение, касающееся кода предупреждения pep8 W191,

Я надеюсь, что все вышеперечисленное поможет вам понять природу проблемы, с которой вы столкнулись, и как ее предотвратить в будущем.

jupiar
источник
0

Иногда tabпортится во время отступа. Один из способов - это, очевидно, использовать tabи backspaceправильно делать отступы для кода.

Другой способ - использовать space 4 раза (в зависимости от того, сколько вы хотите сделать отступ).

Странный способ, который работал для меня, когда больше ничего не работало, в зависимости от того, какую строку я получаю, я переводил backspacedэту строку на предыдущую строку и затем нажимал enter. Он автоматически сдвинул строку к правильному положению, и после этого я не получил никакой ошибки.

Надеюсь, это должно помочь.

Сарвагья Гупта
источник
0

У меня была такая же проблема, и я исправил ее, используя следующий скрипт на Python. надеюсь, это поможет другим.

это из-за использования табуляции и пробелов для отступа кода. в этом скрипте я заменяю каждую вкладку четырьмя пробелами.

input_file = "source code path here"  # e.g. source.py
output_file = "out put file path here"  # e.g out.py
with open(input_file, 'r') as source:
    with open(output_file, 'a+') as result:
        for line in source:
            line = line.replace('\t', '    ')
            result.write(line)

Если вы используете Sublime или любой другой редактор, который дает вам инструмент для замены текста, вы можете заменить все вкладки на четыре пробела из редактора.

Фарбод Шахинфар
источник
0

Используйте, Idle для python или Idle3 для python3.

simc
источник
2
Немного подробностей о том, как / почему это работает для вас, было бы полезно.
Таслим Осени
Проблема из-за вкладок вместо пробелов в регионе. В режиме ожидания можно удалить всю область и устранить проблему (просто выберите Untabify в меню формата).
simc
0

Решить это с помощью редактора Vim

  1. Открыть терминал ( Ctrl+ Alt+ T).
  2. Перейдите в каталог, где находится файл ( cd <path_to_your_directory>). Пример: cd /home/vineeshvs/work.
  3. Откройте файл в Vim ( vim <file_name>). Пример: vim myfile.txt.
  4. [Необязательный шаг] Включить подсветку ключевых слов поиска в Vim ( ESC :set hlsearch)
  5. Перейдите на линию, где у вас есть эта проблема ( ESC :<line_number>). Пример: :53в редакторе Vim после ESCоднократного нажатия кнопки.
  6. Замените вкладки, используя необходимое количество пробелов в Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Пример: Tab будет заменен на четыре пробела следующей командой: :.,$s/\t/ /gcпосле ESC однократного нажатия кнопки). Этот процесс является интерактивным. Вы можете дать yзаменить вкладку пробелами и nпропустить конкретную замену. Нажмите, ESCкогда закончите с необходимыми заменами.
vineeshvs
источник
0

Я странно столкнулся с подобной проблемой с одним из моих .py файлов. Я просто открыл файл в Pycharm и нажал Option+ Command+, Lкоторый правильно форматирует содержимое файла за один раз.

Я подозреваю, что у меня были проблемы, потому что я закодировал этот конкретный файл .py через jupyter labs, в отличие от моего обычного выбора возвышенного текста или Pycharm, и поэтому столкнулся с некоторыми скрытыми проблемами отступов, на которые многие ответы здесь ссылались

DrDEE
источник
0

Ну, у меня была та же проблема, и я понял, что проблема в том, что я скопировал код из другого редактора Python в возвышенное.

Я работал с ноутбуком Jupyter, а затем скопировал код в возвышенное. Очевидно, что когда вы вносите конкретные изменения (например, перемещаете код в функции), отступы становятся беспорядочными, и именно в этом и заключается проблема.

Так что просто придерживайтесь одного редактора. Если вы это сделаете, то у вас не будет проблем.

Летсиос Мантос
источник
0

С pylintего помощью вы получите подробный отчет о том, сколько мест вам нужно и где.

Аймен Альсаади
источник
0

Если вы используете ATOM:

Зайдите в Меню: Пакеты -> WhiteSpace -> Преобразовать все вкладки в пробелы

Даниэль Морайт
источник
0

Попробуйте удалить отступы, а затем систематически нажимать клавишу табуляции или пробел 4 раза. Это обычно происходит со мной, когда у меня есть отступ с помощью клавиши табуляции, а затем с помощью клавиши пробела в следующей строке.

Фатех
источник
-2

Выделите отступы и нажмите вкладки. Тогда они станут последовательными :)

анонимное
источник
2
Это противоречит PEP 8 , каноническому руководству по стилю Python, в котором рекомендуется 4 пробела. Советовать людям использовать вкладки более противоречиво.
Аврора0001,
не говоря уже о том, что если соавторы этого кода, использующие PEP8, столкнутся с той же ошибкой
Томас Мэтью