“Penggunaan tab dan spasi yang tidak konsisten dalam indentasi”

222

Saya mencoba membuat aplikasi dengan Python 3.2 dan saya menggunakan tab setiap saat untuk indentasi, tetapi bahkan editor mengubah beberapa dari mereka menjadi spasi dan kemudian mencetak "penggunaan tab dan spasi yang tidak konsisten dalam indentasi" ketika saya mencoba menjalankan program.

Bagaimana saya bisa mengubah spasi menjadi tab? Ini membuatku gila. (Saya seorang pemula dalam pemrograman). Saya akan senang jika saya bisa mendapatkan beberapa tips tentang kode saya secara keseluruhan, jika saya telah melakukan banyak kesalahan saya akan senang mendengarnya.

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
Julia Lärkert
sumber
27
Itu masalah dengan editor kode Anda, tidak benar-benar dengan python. Anda harus mengubah pertanyaan Anda untuk mencerminkan itu dan menyebutkan editor apa yang Anda gunakan.
Jeff Mercado
3
Bagaimana Anda mengubah ini tergantung pada editor Anda. Saya tidak yakin ini bahkan pada topik di sini, mungkin menjadi pertanyaan bagi pengguna super.
Lennart Regebro
Ubah editor Anda untuk menampilkan ruang kosong yang terlihat di awal baris. Sebagai contoh, saya telah mengkonfigurasi editor saya untuk menampilkan tab transparan dan spasi yang terlihat karena saya menggunakan tab untuk indentasi kode. Jika saya melihat suara di awal baris, saya tahu ada satu atau lebih ruang ekstra. Jika Anda bersikeras melakukannya dengan cara yang salah, Anda dapat mengonfigurasi editor Anda untuk menyembunyikan spasi dan menampilkan tab. (Ya, saya tahu tentang PEP-8 tapi saya tidak setuju dengan itu.)
Mikko Rantalainen

Jawaban:

277

Jangan gunakan tab.

  1. Atur editor Anda menggunakan 4 spasi untuk lekukan.
  2. Lakukan pencarian dan ganti untuk mengganti semua tab dengan 4 spasi.
  3. Pastikan editor Anda diatur untuk menampilkan tab sebagai 8 spasi.

Catatan: Alasan 8 spasi untuk tab adalah agar Anda segera mengetahui kapan tab telah dimasukkan secara tidak sengaja - seperti saat menyalin dan menempel dari kode contoh yang menggunakan tab alih-alih spasi.

Lennart Regebro
sumber
7
Apakah ada alasan di balik dogma-dogma ini?
RocketR
1
@Lennart Regebro, maksud saya menggunakan spasi sama sekali. Saya menggunakannya tetapi secara tidak sadar, tab tampak lebih baik bagi saya. Omong-omong, dalam pemrograman Ruby semua orang menggunakan 2 spasi, jadi itu bukan aturan tunggal untuk semua.
RocketR
3
@RocketR: Jawabannya adalah untuk Python. Jika Anda menggunakan tab saja, Anda mendapatkan lekukan 8-ruang, kecuali jika Anda memperluas tab ke sesuatu yang lebih dari 8 spasi, dalam hal ini akan terlihat buruk pada editor lain. Jika Anda mencampur tab dan spasi, mungkin rusak (lihat pertanyaan) atau terlihat rusak jika Anda memiliki selain ekspansi 8-ruang tab. Singkatnya: Menggunakan tab untuk indentasi sangat buruk. Jangan pernah melakukan itu (kecuali untuk bahasa / format file yang memerlukannya). Tamat.
Lennart Regebro
2
@RocketR Python memiliki Pep8, sebuah dokumen yang berisi daftar "gaya python yang baik" yang secara eksplisit menyatakan bahwa 4 spasi adalah bentuk yang diterima pada indentasi.
Daniel Gratzer
4
Tautan ke bagian PEP 8 yang relevan pada spoiler "Tabs Spaces" : baris pertama adalah "Spaces adalah metode indentasi yang disukai."
Tadhg McDonald-Jensen
63

Menggunakan autopep8perintah di bawah ini untuk saya:

 autopep8 -i my_file.py

Dokumentasi untuk autopep8 ditautkan di sini.

Akavall
sumber
43

Dengan editor IDLE Anda dapat menggunakan ini:

  • Menu EditPilih Semua
  • Format Menu → Wilayah Untabify
  • Dengan asumsi editor Anda telah mengganti 8 spasi dengan tab, masukkan 8 ke dalam kotak input.
  • Tekan pilih, dan itu memperbaiki seluruh dokumen.
arsb48
sumber
15

Jika Anda menggunakan Sublime Text untuk pengembangan Python, Anda dapat menghindari kesalahan dengan menggunakan paket Anaconda. Setelah menginstal Anaconda, buka file Anda dalam Sublime Text, klik kanan pada ruang terbuka → pilih Anaconda → klik pada autoformat. Selesai . Atau tekan Ctrl+ Alt+ R.

Kapilfreeman
sumber
12

Secara umum, orang lebih suka indentasi dengan ruang. Ini lebih konsisten di seluruh editor, menghasilkan lebih sedikit ketidakcocokan seperti ini. Namun, Anda diizinkan untuk indentasi dengan tab. Itu pilihanmu; Namun, Anda harus menyadari bahwa standar 8 spasi per tab agak lebar.

Mengenai masalah Anda, kemungkinan besar, editor Anda kacau. Untuk mengonversi tab ke ruang sangat tergantung pada editor.

Di Emacs, misalnya, Anda dapat memanggil metode 'tidak ditandai'.

Pada baris perintah, Anda dapat menggunakan garis sed (menyesuaikan jumlah spasi untuk apa pun yang Anda sukai):

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py
Bruce
sumber
9

Saat menggunakan editor teks luhur, saya dapat memilih segmen kode saya yang memberi saya inconsistent use of tabs and spaces in indentationkesalahan dan memilih:

view > indentation > convert indentation to spaces

yang menyelesaikan masalah bagi saya.

Dulangi_Kanchana
sumber
8

Apa yang saya lakukan ketika kesalahan yang sama muncul: Pilih semuanya ( Str+ A) dan tekan Shift+ Tab. Jadi tidak ada yang indentasi lagi. Sekarang kembali ke baris yang ingin Anda lekukan, dan pasang kembali seperti yang Anda inginkan.

Itu bekerja untuk saya ...

hccavs19
sumber
7

Saya baru-baru ini memiliki masalah yang sama dan menemukan bahwa saya hanya perlu mengubah charset file .py ke UTF-8 karena itulah set menggunakan Python 3.

BTW, saya menggunakan tab 4-ruang sepanjang waktu, jadi masalahnya bukan disebabkan oleh mereka.

Vlad
sumber
6

Teks Luhur 3

Dalam Sublime Text, WHILE mengedit sebuah Python berkas:

Menu Teks Luhur > Preferensi > Pengaturan - Khusus Sintaksis :

Pengaturan Python.sublime

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
dingin
sumber
5

Dimungkinkan untuk menyelesaikan masalah ini menggunakan notepad++dengan mengganti Tabs dengan 4 Spaces:

  1. Pilih Cari -> Temukan ... atau tekan Ctrl+F
  2. Pilih tab Ganti
  3. Pada kotak bernama Mode Pencarian, pilih Diperpanjang (\ n, \ r, \ t, \ 0, \ x ...)
  4. Di bidang Temukan apa: tulis \ t
  5. Di bidang Ganti dengan: tekan Space4 kali. Pastikan tidak ada yang lain di bidang ini.
  6. Klik pada tombol Ganti Semua

Bagaimana cara mengganti Tab dengan Spaces

Czarek
sumber
3

Saya punya masalah ini. Solusi: 'tab' Anda sebelum garis masalah adalah spasi, 4, 6, atau 8 spasi. Anda harus menghapusnya dan memasukkan TAB. 't'. Itu saja.

Gaorin
sumber
Sama sekali tidak disarankan menggunakan karakter TAB ketika melakukan coding dengan Python - baca PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66
2

Saya menggunakan Notepad ++ dan mendapatkan kesalahan ini.

Di Notepad ++ Anda akan melihat bahwa tab dan keempat spasi sama, tetapi ketika Anda menyalin kode Anda ke Python IDLE Anda akan melihat perbedaan dan garis dengan tab akan memiliki lebih banyak ruang sebelum itu daripada yang lain.

Untuk mengatasi masalah, saya baru saja menghapus tab sebelum baris kemudian menambahkan empat spasi.

pengguna3625605
sumber
2

Saya memiliki kesalahan yang sama. Saya harus menambahkan beberapa baris kode ke file * .py yang ada. Di Notepad ++ itu tidak berfungsi.

Setelah menambahkan baris kode dan menyimpan, saya mendapat kesalahan yang sama. Ketika saya membuka file yang sama di PyCharm dan menambahkan baris, kesalahannya hilang.

Andrushenko Alexander
sumber
1

Saya mendapatkan kesalahan yang sama tetapi tidak dapat menemukan kesalahan saya.

Jadi saya memperbaikinya dengan menjalankan indentasi otomatis pada kode saya dan memungkinkan mesin memperbaiki kesalahan saya.

Jika ada yang bertanya-tanya bagaimana saya melakukan itu. Sederhana. Pergilah dalam vim. Ketik G = gg.

Ini secara otomatis akan memperbaiki semuanya. Semoga berhasil :)

Shaurya Kapoor
sumber
1

Masalah Anda disebabkan oleh keterbatasan / konfigurasi editor Anda. Beberapa editor memberi Anda alat untuk membantu masalah dengan:

  1. Mengubah tab menjadi spasi

    Misalnya, jika Anda menggunakan editor Python Stani Anda dapat mengkonfigurasinya untuk menghemat.

  2. Mengubah spasi menjadi tab

Jika Anda menggunakan ActiveState Komodo, Anda memiliki alat untuk 'menabulasi' kode Anda. Seperti yang sudah ditunjukkan orang lain, ini bukan ide yang baik.

Pydev dari Eclipse menyediakan fungsi "Konversi tab menjadi space-tab" dan "Konversikan tab-ruang menjadi tab".

joaquin
sumber
1

Jika editor Anda tidak mengenali tab saat melakukan pencarian dan penggantian (seperti SciTE), Anda dapat menempelkan kode ke Word dan mencari menggunakan Ctr-H dan ^ t yang menemukan tab yang kemudian dapat diganti dengan 4 spasi.

kozowh
sumber
1

Ada duplikat dari pertanyaan ini dari sini, tetapi saya pikir saya akan menawarkan pandangan berkaitan dengan editor modern dan beragam fitur yang mereka tawarkan. Dengan kode python, apa pun yang perlu diintegrasikan ke dalam .pyfile, semua harus diintensifkan menggunakan tombol tab, atau dengan spasi. Konvensi akan menggunakan empat ruang untuk lekukan. Sebagian besar editor memiliki kemampuan untuk menampilkan secara visual pada editor apakah kode sedang indentasi dengan spasi atau tab, yang sangat membantu untuk debugging. Misalnya, dengan atom, pergi ke preferensi dan kemudian editor Anda dapat melihat dua opsi berikut:

editor atom untuk menampilkan tab dan spasi

Kemudian jika kode Anda menggunakan spasi, Anda akan melihat titik-titik kecil di mana kode Anda indentasi:

masukkan deskripsi gambar di sini

Dan jika indentasi menggunakan tab, Anda akan melihat sesuatu seperti ini:

masukkan deskripsi gambar di sini

Sekarang jika Anda perhatikan, Anda dapat melihat bahwa ketika menggunakan tab, ada lebih banyak kesalahan / peringatan di sebelah kiri, ini karena sesuatu yang disebut dokumentasi pep8 pep8 , yang pada dasarnya adalah panduan gaya seragam untuk python, sehingga semua pengembang sebagian besar kode untuk standar dan penampilan yang sama, yang membantu ketika mencoba untuk memahami kode orang lain, ada di pep8 yang lebih memilih penggunaan spasi untuk indentasi daripada tab. Dan kita bisa melihat editor menunjukkan bahwa ada peringatan yang berkaitan dengan kode peringatan pep8 W191,

Saya harap semua hal di atas membantu Anda memahami sifat masalah yang Anda alami dan bagaimana mencegahnya di masa depan.

jupiar
sumber
0

Terkadang, tabmemang berantakan saat indentasi. Salah satu caranya adalah dengan menggunakan tabdanbackspace untuk indentasi kode dengan benar.

Cara lain adalah menggunakan space 4 kali (tergantung pada seberapa banyak Anda ingin membuat indentasi).

Sebuah cara aneh yang bekerja untuk saya ketika tidak ada yang lain yang bekerja, baris mana yang saya dapatkan kesalahan, saya backspacedbaris itu ke baris sebelumnya dan kemudian tekanenter . Secara otomatis indentasi baris ke posisi yang benar dan saya tidak mendapatkan kesalahan setelah itu.

Semoga ini bisa membantu.

Sarvagya Gupta
sumber
0

Saya memiliki masalah yang sama dan memperbaikinya menggunakan skrip python berikut. semoga membantu orang lain.

itu karena menggunakan tab dan spasi untuk indentasi kode. dalam skrip ini saya mengganti setiap tab dengan empat spasi.

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)

jika Anda menggunakan sublim atau editor lain yang memberi Anda alat untuk mengganti teks, Anda dapat mengganti semua tab dengan empat spasi dari editor.

Farbod Shahinfar
sumber
0

Gunakan, Idle for python, atau Idle3 for python3.

simc
sumber
2
Sedikit elaborasi tentang bagaimana / mengapa ini bekerja untuk Anda akan sangat membantu.
Taslim Oseni
Masalahnya adalah karena tab bukan spasi di wilayah tersebut. Idle dapat menghapus seluruh wilayah dan memperbaiki masalah (Cukup pilih Untabify dari Format Menu)
simc
0

Memecahkan ini menggunakan editor Vim

  1. Buka terminal ( Ctrl+ Alt+ T).
  2. Buka direktori tempat file berada ( cd <path_to_your_directory>). Ex: cd /home/vineeshvs/work.
  3. Buka file di Vim ( vim <file_name>). Ex:vim myfile.txt .
  4. [Langkah opsional] Aktifkan sorotan kata kunci pencarian di Vim (ESC :set hlsearch )
  5. Buka baris tempat Anda memiliki masalah ini ( ESC :<line_number>). Contoh: :53dalam editor Vim setelah menekanESC tombol sekali.
  6. Ganti tab menggunakan jumlah spasi yang diperlukan di Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Mis: Tab akan diganti dengan empat spasi menggunakan perintah berikut: :.,$s/\t/ /gcsetelah menekan ESC tombol sekali). Proses ini bersifat interaktif. Anda dapat memberi yuntuk mengganti tab dengan spasi dan nuntuk melewatkan penggantian tertentu. Tekan ESCsaat Anda selesai dengan penggantian yang diperlukan.
anggur
sumber
0

Anehnya saya mengalami masalah yang sama dengan salah satu file .py saya. Saya hanya membuka file dalam Pycharm dan menekan Option+ Command+ Lyang dengan benar memformat konten file dalam sekali jalan.

Saya curiga saya mengalami masalah karena saya mengkodekan file .py ini melalui lab jupyter yang bertentangan dengan pilihan teks biasa atau Pycharm yang biasa saya pakai dan karena itu mengalami beberapa masalah lekukan tersembunyi yang banyak dijawab oleh jawaban di sini.

DrDEE
sumber
0

Yah saya punya masalah yang sama dan saya menyadari bahwa masalahnya adalah saya menyalin kode dari editor python lain untuk luhur.

Saya sedang bekerja dengan notebook jupyter dan kemudian saya menyalin kode ke agung. Rupanya ketika Anda membuat modifikasi spesifik (seperti memindahkan kode dalam fungsi) maka lekukan menjadi berantakan dan dari sinilah masalahnya.

Jadi hanya berpegang pada satu editor. Jika Anda melakukannya, maka Anda tidak akan mengalami masalah.

Letsios Manthos
sumber
0

Menggunakannya pylintakan memberi Anda laporan terperinci tentang berapa banyak ruang yang Anda butuhkan dan di mana.

Aymen Alsaadi
sumber
0

Jika Anda menggunakan ATOM:

Buka Menu: Paket -> WhiteSpace -> Konversi semua Tab menjadi Spasi

Daniel Moraite
sumber
0

Cobalah menghapus indentasi dan kemudian secara sistematis menekan tab atau menekan spasi 4 kali. Ini biasanya terjadi pada saya ketika saya memiliki indentasi menggunakan tombol tab dan kemudian menggunakan tombol spasi di baris berikutnya.

Fateh
sumber
-2

Tinggikan bit indentasi, lalu klik tab. Mereka kemudian akan menjadi konsisten :)

Anonim
sumber
2
Ini bertentangan dengan PEP 8 , panduan gaya Python kanonik, yang merekomendasikan 4 spasi. Menyarankan orang untuk menggunakan tab lebih tidak konsisten.
Aurora0001
belum lagi jika kolaborator pada kode ini yang menggunakan PEP8 akan menghadapi kesalahan yang sama
Thomas Matthew