“ การใช้แท็บและช่องว่างที่ไม่สอดคล้องกันในการเยื้อง”


220

ฉันกำลังพยายามสร้างแอปพลิเคชันใน 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

26
นั่นเป็นปัญหาของเครื่องมือแก้ไขโค้ดไม่ใช่ของ python คุณควรเปลี่ยนคำถามของคุณเพื่อสะท้อนให้เห็นและพูดถึงสิ่งที่คุณกำลังใช้แก้ไข
Jeff Mercado

3
วิธีที่คุณเปลี่ยนแปลงสิ่งนี้ขึ้นอยู่กับบรรณาธิการของคุณ ฉันไม่แน่ใจว่านี่เป็นหัวข้อที่นี่อาจเป็นคำถามสำหรับ superuser
Lennart Regebro

เปลี่ยนเครื่องมือแก้ไขของคุณเพื่อแสดงช่องว่างที่มองเห็นได้ที่จุดเริ่มต้นของบรรทัด ตัวอย่างเช่นฉันได้กำหนดค่าตัวแก้ไขให้แสดงแท็บโปร่งใสและช่องว่างที่มองเห็นได้เนื่องจากฉันใช้แท็บเพื่อเยื้องรหัส ถ้าฉันเห็นสัญญาณรบกวนใด ๆ ที่จุดเริ่มต้นของบรรทัดฉันรู้ว่ามีช่องว่างอย่างน้อยหนึ่งช่อง หากคุณยืนยันในการทำในวิธีที่ไม่ถูกต้องคุณสามารถกำหนดค่าตัวแก้ไขของคุณเพื่อซ่อนช่องว่างและแสดงแท็บ (ใช่ฉันรู้เกี่ยวกับ PEP-8 แต่ฉันไม่เห็นด้วยกับเรื่องนี้)
Mikko Rantalainen

คำตอบ:


274

อย่าใช้แท็บ

  1. ตั้งค่าตัวแก้ไขของคุณให้ใช้ 4 ช่องว่างสำหรับการเยื้อง
  2. ทำการค้นหาและแทนที่เพื่อแทนที่แท็บทั้งหมดด้วย 4 ช่องว่าง
  3. ตรวจสอบให้แน่ใจว่าตัวแก้ไขของคุณถูกตั้งค่าให้แสดงแท็บเป็น 8 ช่องว่าง

หมายเหตุ: เหตุผลที่มี 8 ช่องว่างสำหรับแท็บคือเพื่อให้คุณสังเกตเห็นได้ทันทีเมื่อมีการแทรกแท็บโดยไม่ได้ตั้งใจเช่นเมื่อคัดลอกและวางจากโค้ดตัวอย่างที่ใช้แท็บแทนช่องว่าง


7
มีเหตุผลใดที่อยู่เบื้องหลังความประพฤติเหล่านี้หรือไม่?
RocketR

1
@ Lenart Regebro ฉันหมายถึงการใช้ช่องว่างเลย ฉันใช้มัน แต่ไม่รู้ตัวแท็บดูดีกว่าสำหรับฉัน อย่างไรก็ตามในการเขียนโปรแกรม Ruby ทุกคนใช้ 2 ช่องว่างดังนั้นจึงไม่ใช่กฎเดียวสำหรับทุกคน
RocketR

3
@RocketR: คำตอบสำหรับ Python หากคุณใช้แท็บเท่านั้นคุณจะได้รับการเยื้องพื้นที่ 8 เว้นเสียแต่ว่าคุณจะขยายแท็บไปที่อย่างอื่นมากกว่า 8 ช่องว่างซึ่งในกรณีนี้มันจะดูไม่ดีสำหรับบรรณาธิการอื่น ๆ หากคุณผสมแท็บและช่องว่างมันอาจแตก (ดูคำถาม) หรือดูเสียถ้าคุณมีการขยายแท็บมากกว่า 8 ช่องว่าง โดยสรุป: การใช้แท็บสำหรับการเยื้องนั้นไม่ดีอย่างไม่น่าเชื่อ ไม่เคยทำเช่นนั้น (ยกเว้นภาษา / รูปแบบไฟล์ที่จำเป็นต้องใช้) ตอนจบ.
Lennart Regebro

2
@RocketR Python มี Pep8 ซึ่งเป็นเอกสารที่แสดงรายการ "สไตล์ python ที่ดี" ซึ่งระบุอย่างชัดเจนว่าช่องว่าง 4 รายการเป็นรูปแบบที่ยอมรับในการเยื้อง
Daniel Gratzer

4
ลิงก์ไปยังส่วน PEP 8 ที่เกี่ยวข้องในสปอยเลอร์"Tabs vs Spaces" : บรรทัดแรกคือ"Spaces เป็นวิธีการเยื้องที่ต้องการ"
Tadhg McDonald-Jensen


43

ด้วยตัวแก้ไขIDLEคุณสามารถใช้สิ่งนี้:

  • เมนูแก้ไขเลือกทั้งหมด
  • รูปแบบเมนู→ไม่เปลี่ยนพื้นที่
  • สมมติว่าเอดิเตอร์ของคุณได้แทนที่ 8 ช่องว่างด้วยแท็บแล้วป้อน 8 ลงในกล่องอินพุต
  • กดเลือกและจะแก้ไขเอกสารทั้งหมด

15

หากคุณใช้Sublime Textสำหรับการพัฒนา Python คุณสามารถหลีกเลี่ยงข้อผิดพลาดได้โดยใช้แพ็คเกจ Anaconda หลังจากติดตั้ง Anaconda แล้วให้เปิดไฟล์ของคุณใน Sublime Text คลิกขวาที่ช่องว่าง→เลือกAnaconda →คลิกที่รูปแบบอัตโนมัติ เสร็จสิ้น หรือกดCtrl+ +AltR


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 ใช้

BTW ฉันใช้แท็บ 4 ช่องว่างตลอดเวลาดังนั้นปัญหาไม่ได้เกิดจากพวกเขา


6

ข้อความประเสริฐ 3

ใน Sublime ข้อความในขณะที่ การแก้ไขหลามไฟล์:

เมนูข้อความประเสริฐ > การตั้งค่า >การตั้งค่า - เฉพาะไวยากรณ์ :

Python.sublime การตั้งค่า

{
    "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. ในฟิลด์แทนที่ด้วย:กดSpace4 ครั้ง ตรวจสอบให้แน่ใจว่าไม่มีสิ่งใดในฟิลด์นี้
  6. คลิกที่ปุ่มแทนที่ทั้งหมด

วิธีแทนที่แท็บด้วย Spaces


3

ฉันมีปัญหานี้ การแก้ไข: 'แท็บ' ของคุณก่อนบรรทัดปัญหาคือช่องว่าง 4, 6 หรือ 8 ช่องว่าง คุณควรลบและใส่ TAB '\ t' นั่นคือทั้งหมดที่


ไม่แนะนำให้ใช้อักขระ TAB เลยเมื่อทำการเข้ารหัสด้วย Python - อ่าน PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66

2

ฉันใช้ Notepad ++ และได้รับข้อผิดพลาดนี้

ใน Notepad ++ คุณจะเห็นว่าทั้งแท็บและช่องว่างทั้งสี่นั้นเหมือนกัน แต่เมื่อคุณคัดลอกรหัสของคุณไปยัง Python IDLEคุณจะเห็นความแตกต่างและบรรทัดที่มีแท็บจะมีช่องว่างมากกว่าหน้าอื่น

เพื่อแก้ปัญหาฉันเพิ่งลบแท็บก่อนบรรทัดจากนั้นเพิ่มช่องว่างสี่ช่อง


2

ฉันมีข้อผิดพลาดเดียวกัน ฉันต้องเพิ่มรหัสหลายบรรทัดไปยังไฟล์ * .py ที่มีอยู่ ใน Notepad ++ มันไม่ทำงาน

หลังจากเพิ่มรหัสบรรทัดและบันทึกฉันได้รับข้อผิดพลาดเดียวกัน เมื่อฉันเปิดไฟล์เดียวกันในPyCharmและเพิ่มบรรทัดข้อผิดพลาดหายไป


1

ฉันพบข้อผิดพลาดเดียวกัน แต่ไม่สามารถหาสิ่งที่ฉันทำผิดได้

ดังนั้นฉันจึงแก้ไขโดยใช้การเยื้องรหัสของฉันโดยอัตโนมัติและอนุญาตให้เครื่องแก้ไขข้อผิดพลาดของฉัน

หากใครสงสัยว่าฉันทำอย่างนั้น ง่าย ไปเป็นกลุ่ม พิมพ์เป็น G = gg

สิ่งนี้จะแก้ไขทุกอย่างโดยอัตโนมัติ โชคดี :)


1

ปัญหาของคุณเกิดจากข้อ จำกัด / การกำหนดค่าของตัวแก้ไข บรรณาธิการบางคนมีเครื่องมือที่จะช่วยคุณแก้ไขปัญหาโดย:

  1. การแปลงแท็บเป็นช่องว่าง

    ตัวอย่างเช่นหากคุณใช้เครื่องมือแก้ไข Python ของ Stani คุณสามารถกำหนดค่าให้ทำในการบันทึกได้

  2. การแปลงช่องว่างเป็นแท็บ

หากคุณใช้ ActiveState Komodo คุณมีเครื่องมือในการ 'tabify' โค้ดของคุณ ตามที่คนอื่นชี้ไปแล้วนี่ไม่ใช่ความคิดที่ดี

Pydev ของ Eclipse มีฟังก์ชัน "แปลงแท็บเป็น space-tabs" และ "แปลง space-tabs เป็น tabs"


1

หากตัวแก้ไขของคุณไม่รู้จักแท็บเมื่อทำการค้นหาและแทนที่ (เช่น SciTE) คุณสามารถวางรหัสลงใน Word และค้นหาโดยใช้ Ctr-H และ ^ t ซึ่งจะค้นหาแท็บที่สามารถแทนที่ด้วยช่องว่าง 4 ช่อง


1

มีคำถามนี้ซ้ำกันจากที่นี่แต่ฉันคิดว่าฉันจะเสนอมุมมองเกี่ยวกับบรรณาธิการที่ทันสมัยและคุณสมบัติที่หลากหลายที่พวกเขาเสนอ ด้วยรหัสไพ ธ อนสิ่งใดก็ตามที่จำเป็นต้องมีความตั้งใจใน.pyไฟล์จะต้องมีความตั้งใจที่จะใช้คีย์แท็บหรือช่องว่าง การประชุมคือการใช้สี่ช่องว่างสำหรับการเยื้อง ผู้แก้ไขส่วนใหญ่มีความสามารถในการแสดงให้เห็นด้วยสายตาเกี่ยวกับการแก้ไขว่ามีการย่อหน้ารหัสด้วยการเว้นวรรคหรือแท็บซึ่งช่วยในการดีบักอย่างมาก ตัวอย่างเช่นด้วย atom ไปที่การกำหนดค่าตามความชอบแล้วตัวแก้ไขคุณสามารถดูสองตัวเลือกต่อไปนี้:

ตัวแก้ไข atom เพื่อแสดงแท็บและช่องว่าง

จากนั้นหากรหัสของคุณใช้ช่องว่างคุณจะเห็นจุดเล็ก ๆ ที่โค้ดของคุณเยื้อง:

ป้อนคำอธิบายรูปภาพที่นี่

และหากมีการเยื้องโดยใช้แท็บคุณจะเห็นสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ถ้าคุณสังเกตเห็นคุณจะเห็นว่าเมื่อใช้แท็บมีข้อผิดพลาด / คำเตือนเพิ่มเติมทางด้านซ้ายนี่เป็นเพราะสิ่งที่เรียกว่าเอกสาร pep8 pep8ซึ่งโดยทั่วไปแล้วจะเป็นคู่มือสไตล์ที่เป็นรูปแบบสำหรับงูใหญ่ มาตรฐานและรูปลักษณ์ที่เหมือนกันซึ่งช่วยเมื่อพยายามทำความเข้าใจกับรหัสประชาชนอื่น ๆ มันอยู่ใน 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

ใช้, ไม่ใช้งานสำหรับ python หรือ Idle3 สำหรับ python3


2
รายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีการ / สาเหตุที่ทำให้คุณมีประโยชน์
Taslim Oseni

ปัญหานี้เกิดจากแท็บแทนที่จะเว้นวรรคในพื้นที่ ไม่ได้ใช้งานสามารถยกเลิกการแก้ไขพื้นที่ทั้งหมดและแก้ไขปัญหา (เพียงแค่เลือกไม่เปลี่ยนขนาดจากรูปแบบเมนู)
simc

0

การแก้ปัญหานี้โดยใช้ Vim editor

  1. เปิดเทอร์มินัล ( Ctrl+ Alt+ T)
  2. ไปที่ไดเรกทอรีที่ไฟล์นั้นอยู่ ( cd <path_to_your_directory>) cd /home/vineeshvs/workEx:
  3. เปิดไฟล์ใน Vim ( vim <file_name>) vim myfile.txtEx:
  4. [ขั้นตอนที่เลือกได้] เปิดใช้งานการเน้นคำค้นหาใน Vim ( ESC :set hlsearch)
  5. ไปที่บรรทัดที่คุณมีปัญหานี้ ( ESC :<line_number>) เช่น:53ในโปรแกรมแก้ไขเสียงเรียกเข้าหลังจากกด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 นี้ผ่านทางห้องปฏิบัติการ jupyter ซึ่งตรงข้ามกับตัวเลือกปกติของฉันในข้อความ Sublime หรือ Pycharm ดังนั้นจึงพบปัญหาการเยื้องที่ซ่อนอยู่หลายคำตอบที่นี่ทำให้


0

ฉันมีปัญหาเดียวกันและฉันรู้ว่าปัญหาคือฉันคัดลอกโค้ดจากเครื่องมือแก้ไข python ตัวอื่นไปยังประเสริฐ

ฉันทำงานกับสมุดบันทึก jupyter แล้วฉันก็คัดลอกรหัสลงในประเสริฐ เห็นได้ชัดว่าเมื่อคุณทำการแก้ไขที่เฉพาะเจาะจง (เช่นการย้ายรหัสในฟังก์ชั่น) จากนั้นเยื้องจะยุ่งและนี่คือที่มาของปัญหา

ดังนั้นเพียงแค่ติดหนึ่งแก้ไข หากคุณทำเช่นนั้นคุณจะไม่มีปัญหา


0

ใช้pylintมันจะให้รายงานรายละเอียดเกี่ยวกับจำนวนช่องว่างที่คุณต้องการและที่


0

หากคุณใช้ ATOM:

ไปที่เมนู: แพ็คเกจ -> WhiteSpace -> แปลงแท็บทั้งหมดเป็นช่องว่าง


0

ลองลบการเยื้องและกดแท็บหรือพื้นที่กด 4 ครั้งอย่างเป็นระบบ สิ่งนี้มักเกิดขึ้นกับฉันเมื่อฉันมีการเยื้องโดยใช้ปุ่มแท็บจากนั้นใช้ปุ่มเว้นวรรคในบรรทัดถัดไป


-2

สูงบิตที่เยื้องแล้วคลิกแท็บ พวกเขาจะสอดคล้องกัน :)


2
สิ่งนี้ขัดแย้งกับPEP 8คู่มือสไตล์ canonical Python ซึ่งแนะนำช่องว่าง 4 ช่อง การให้คำแนะนำคนที่จะใช้แท็บนั้นไม่สอดคล้องกันมากขึ้น
Aurora0001

ไม่ต้องพูดถึงว่าหากผู้ทำงานร่วมกันในรหัสนี้ที่ใช้ PEP8 จะพบข้อผิดพลาดเดียวกัน
Thomas Matthew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.