"Непослідовне використання вкладок і пробілів у відступі"


218

Я намагаюся створити додаток у 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

25
Це проблема з вашим редактором коду, а не з python. Ви повинні змінити своє запитання, щоб відобразити це, і зазначити, яким редактором ви користуєтесь.
Джефф Меркадо

3
Як ви це зміните, залежить від вашого редактора. Я не впевнений, що це навіть на тему, це може бути питання для суперпользователя.
Леннарт Регебро

Змініть редактор, щоб на початку рядка відображався видимий пробіл. Наприклад, я налаштував свій редактор на показ прозорих вкладок і видимих ​​пробілів, оскільки я використовую вкладки для відступу коду. Якщо я бачу шум на початку рядка, я знаю, що є одне чи більше зайвих пробілів. Якщо ви наполягаєте на тому, щоб це зробити невірним способом, ви можете налаштувати свій редактор, щоб приховувати пробіли та показувати вкладки. (Так, я знаю про PEP-8, але з цим я не згоден.)
Mikko Rantalainen

Відповіді:


273

Не використовуйте вкладки.

  1. Налаштуйте редактор використовувати 4 пробіли для відступу.
  2. Зробіть пошук і замініть, щоб замінити всі вкладки на 4 пробіли.
  3. Переконайтеся, що ваш редактор встановлений для відображення вкладок у вигляді 8 пробілів.

Примітка. Причина 8 пробілів для вкладок полягає в тому, що ви відразу помічаєте, коли вкладки були ненавмисно вставлені - наприклад, при копіюванні та вставці з прикладу коду, який використовує вкладки замість пробілів.


7
Чи є якісь міркування за цими догмами?
RocketR

1
@ Леннарт Регебро, я маю на увазі використання пробілів взагалі. Я їх використовую, але несвідомо, вкладки мені здаються кращими. До речі, в програмуванні Ruby кожен використовує 2 пробіли, тож це не єдине правило для всіх.
RocketR

3
@RocketR: Відповідь стосується Python. Якщо ви використовуєте лише вкладки, ви отримуєте відступ у 8 пробілів, якщо ви не розширите вкладки на щось інше, ніж на 8 пробілів, і в цьому випадку це буде погано виглядати на інших редакторах. Якщо ви змішуєте вкладки та пробіли, він може зламатися (див. Питання) або виглядати зламаним, якщо у вас є розширення 8-пробілів вкладок. Підсумовуючи: Використання вкладок для відступу неймовірно погано. Ніколи цього не робіть (за винятком мов / форматів файлів, які цього вимагають). Кінець.
Леннарт Регебро

2
@RocketR Python має Pep8, документ, у якому перерахований "хороший стиль пітона", в якому прямо зазначено, що 4 пробіли - це прийнята форма на відступ.
Даніель Грацер

4
Посилання на відповідний розділ PEP 8 на спойлері "Вкладки та пробіли" : перший рядок - "Пробіли є кращим методом відступу".
Tadhg McDonald-Jensen


43

За допомогою редактора IDLE ви можете користуватися цим:

  • Редагування меню → Виберіть все
  • Формат меню → Нестабільний регіон
  • Припускаючи, що ваш редактор замінив 8 пробілів на вкладку, введіть 8 у поле введення.
  • Натисніть select, і він виправить весь документ.

15

Якщо ви використовуєте Sublime Text для розробки Python, ви можете уникнути помилки, використовуючи пакет Anaconda. Після встановлення Anaconda відкрийте файл у Sublime Text, клацніть правою кнопкою миші на просторах → виберіть Anaconda → натисніть на автоформат. Зроблено . Або натисніть Ctrl+ Alt+ R.


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

що вирішило для мене питання.


8

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

Це працювало для мене ...


7

Нещодавно у мене виникла така ж проблема і з'ясувалося, що мені просто потрібно конвертувати схему .py-файлу в UTF-8 оскільки це використовується набір Python 3.

До речі, я весь час використовував 4-пробільні вкладки, тому проблема не була викликана ними.


6

Піднесений текст 3

У Sublime Text, ПОКИ редагування в Python файл:

Меню піднесеного тексту > Налаштування > Налаштування - Конкретний синтаксис :

Python.sublime-settings

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}

5

Вирішити цю проблему можна за notepad++допомогою заміни Tabs на 4 Spaces:

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

Як замінити вкладки на пробіли


3

У мене була ця проблема. Рішення: ваша "вкладка" перед проблемним рядком - це пробіли, 4, 6 або 8 пробілів. Ви повинні стерти їх і вставити TAB. '\ t'. Це все.


Не рекомендується використовувати символи TAB взагалі при кодуванні з Python - читайте PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66,

2

Я використовую Notepad ++ і отримав цю помилку.

У «Блокноті ++» ви побачите, що і вкладка, і чотири пробіли однакові, але коли ви копіюєте свій код в Python IDLE, ви побачите різницю, і рядок із вкладкою матиме більше місця перед цим, ніж інші.

Щоб вирішити проблему, я просто видалив вкладку перед рядком і потім додав чотири пробіли.


2

У мене була така ж помилка. Мені довелося додати кілька рядків коду до наявного файлу * .py. У Блокноті ++ це не працювало.

Після додавання рядків коду та збереження я отримав таку ж помилку. Коли я відкрив той самий файл у PyCharm і додав рядки, помилка зникла.


1

Я отримав ті самі помилки, але не міг зрозуміти, що я роблю неправильно.

Тому я виправив це, застосувавши автовідступ на своєму коді і дозволив машині виправити свою помилку.

Якщо хтось цікавиться, як я це зробив. Простий. Ідіть у вім. Введіть G = gg.

Це автоматично все виправить. Удачі :)


1

Ваша проблема пов’язана з обмеженнями / конфігурацією редактора. Деякі редактори надають вам інструменти для вирішення проблеми:

  1. Перетворення вкладок у пробіли

    Наприклад, якщо ви використовуєте редактор Python Стані, ви можете налаштувати його на збереження.

  2. Перетворення пробілів у вкладки

Якщо ви використовуєте ActiveState Komodo, у вас є інструмент для "підкреслення" вашого коду. Як вже вказували інші, це не дуже гарна ідея.

Pydev Eclipse надає функції "Перетворити вкладки на пробіли" та "Перетворити пробіли у вкладки".


1

Якщо ваш редактор не розпізнає вкладки під час пошуку та заміни (як SciTE), ви можете вставити код у Word та пошук, використовуючи Ctr-H і ^ t, що знаходить вкладки, які потім можна замінити на 4 пробіли.


1

Звідси з'явився дублікат цього питання, але я подумав, що мені запропонують переглянути сучасні редактори та широкий спектр функцій, які вони пропонують. З використанням python-коду все, що має бути намірене у .pyфайлі, має бути або все намірено за допомогою клавіші табуляції, або пробілами. Конвенція полягає у використанні чотирьох пробілів для відступу. Більшість редакторів мають можливість візуально показувати в редакторі, чи код відведений пробілами чи вкладками, що значно допомагає для налагодження. Наприклад, з atom, перейшовши до налаштувань, а потім редактор, ви можете побачити наступні два варіанти:

редактор атомів, щоб відобразити вкладки та пробіли

Тоді, якщо ваш код використовує пробіли, ви побачите маленькі крапки, де ваш код з відступом:

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

І якщо він буде розміщений з відступом за допомогою вкладок, ви побачите щось подібне:

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

Тепер, якщо ви помітили, ви можете помітити, що при використанні вкладок зліва більше помилок / попереджень, це через щось, що називається документацією на pep8 pep8 , яка в основному є єдиним керівництвом стилю для python, так що всі розробники здебільшого кодують той самий стандарт і зовнішній вигляд, який допомагає при спробі зрозуміти код інших народів, саме в pep8 вигідніше використовувати пробіли для відступу, а не для вкладок. І ми можемо побачити редактор, який показує, що існує попередження щодо коду попередження pep8W191 ,

Я сподіваюся, що все вищесказане допоможе вам зрозуміти природу проблеми, яка виникає, і як її запобігти в майбутньому.


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)

якщо ви використовуєте піднесений або будь-який інший редактор, який дає вам інструмент для заміни тексту, ви можете замінити всі вкладки на чотири пробіли від редактора.


0

Використовуйте, Idle для python, або Idle3 для python3.


2
Невелика деталізація того, як / чому це працювало для вас, була б корисною.
Таслім Осені

Проблема полягає в тому, що вкладки замість пробілів у регіоні. У режимі очікування можна нестабілізувати всю область та виправити проблему (просто виберіть Untabify from Format Menu).
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). Наприклад: вкладку буде замінено чотирма пробілами за допомогою наступної команди: :.,$s/\t/ /gcпісля натискання ESC кнопки один раз). Цей процес є інтерактивним. Ви можете дати yзамінити вкладку пробілами та nпропустити певну заміну. Натисніть, ESCколи закінчите потрібні заміни.

0

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

Я підозрюю, що у мене виникли проблеми, тому що я зашифрував цей конкретний файл .py через лабораторії юпітера, на відміну від мого звичайного вибору піднесеного тексту чи Pycharm, і тому натрапив на деякі приховані проблеми з відступом, на які багато відповідей тут натякали.


0

У мене була така ж проблема, і я зрозумів, що проблема полягає в тому, що я скопіював код з іншого редактора python в піднесений.

Я працював із зошитом юпітера, а потім скопіював код у піднесене. Мабуть, коли ви вносите конкретні модифікації (наприклад, переміщення коду у функціях), тоді відступ стає безладним, і ось звідки виникає проблема.

Тому просто дотримуйтесь одного редактора. Якщо ви це зробите, то у вас не буде проблем.


0

Використовуючи pylintйого, ви отримаєте докладний звіт про те, скільки місця вам потрібно і де.


0

Якщо ви використовуєте ATOM:

Перейдіть до меню: Пакети -> WhiteSpace -> Перетворити всі вкладки в простори


0

Спробуйте видалити відступи, а потім систематично натискаючи вкладку або натискаючи пробіл 4 рази. Зазвичай це трапляється зі мною, коли у мене є відступ за допомогою клавіші табуляції, а потім використовую клавішу пробілу в наступному рядку.


-2

Виділіть відрізні біти та натисніть вкладки. Потім вони стануть послідовними :)


2
Це суперечить PEP 8 , канонічному посібнику зі стилю Python, який рекомендує 4 місця. Порадити людям користуватися вкладками більш непослідовно.
Aurora0001

не кажучи вже про те, що якщо співробітники цього коду, які використовують PEP8, зіткнуться з тією ж помилкою
Томас Метью
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.