Sử dụng không nhất quán các tab và khoảng trắng trong thụt lề


218

Tôi đang cố gắng tạo một ứng dụng trong Python 3.2 và tôi luôn sử dụng các tab để thụt lề, nhưng ngay cả trình soạn thảo cũng thay đổi một số trong số chúng thành khoảng trắng và sau đó in ra "việc sử dụng các tab và khoảng trắng không nhất quán" khi tôi cố chạy chương trình.

Làm cách nào để thay đổi khoảng trắng thành tab? Nó khiến tôi điên lên. (Tôi là người mới bắt đầu lập trình). Tôi sẽ rất vui nếu tôi có thể nhận được một số lời khuyên tổng thể về mã của mình, nếu tôi đã làm rất nhiều lỗi tôi sẽ rất vui khi nghe.

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
Đó là một vấn đề với trình soạn thảo mã của bạn, không thực sự với python. Bạn nên thay đổi câu hỏi của bạn để phản ánh điều đó và đề cập đến trình soạn thảo bạn đang sử dụng.
Jeff Mercado

3
Làm thế nào bạn thay đổi điều này phụ thuộc vào biên tập viên của bạn. Tôi không chắc đây thậm chí là về chủ đề ở đây, nó có thể là một câu hỏi cho siêu người dùng.
Lennart Regebro

Thay đổi trình chỉnh sửa của bạn để hiển thị khoảng trắng có thể nhìn thấy ở đầu dòng. Ví dụ: tôi đã định cấu hình trình chỉnh sửa của mình để hiển thị các tab trong suốt và khoảng trắng hiển thị vì tôi sử dụng các tab để thụt mã. Nếu tôi thấy bất kỳ tiếng ồn nào ở đầu dòng, tôi biết rằng có một hoặc nhiều khoảng trắng thừa. Nếu bạn khăng khăng làm theo cách không chính xác, bạn có thể định cấu hình trình chỉnh sửa của mình để ẩn dấu cách và hiển thị các tab. (Vâng, tôi biết về PEP-8 nhưng tôi không đồng ý với điều đó.)
Mikko Rantalainen

Câu trả lời:


273

Đừng sử dụng các tab.

  1. Đặt trình chỉnh sửa của bạn để sử dụng 4 khoảng trắng để thụt lề.
  2. Thực hiện tìm kiếm và thay thế để thay thế tất cả các tab bằng 4 khoảng trắng.
  3. Đảm bảo trình chỉnh sửa của bạn được đặt để hiển thị các tab dưới dạng 8 khoảng trắng.

Lưu ý: Lý do cho 8 khoảng trắng cho các tab là để bạn chú ý ngay lập tức khi các tab được chèn vô tình - chẳng hạn như khi sao chép và dán từ mã ví dụ sử dụng các tab thay vì khoảng trắng.


7
Có bất kỳ lý do đằng sau những giáo điều này?
RocketR

1
@Lennart Regebro, ý tôi là sử dụng khoảng trắng. Tôi sử dụng chúng nhưng vô thức, các tab có vẻ tốt hơn đối với tôi. Nhân tiện, trong lập trình Ruby, mọi người đều sử dụng 2 khoảng trắng, vì vậy đó không phải là một quy tắc duy nhất cho tất cả.
RocketR

3
@RocketR: Câu trả lời là dành cho Python. Nếu bạn chỉ sử dụng các tab, bạn sẽ nhận được một vết lõm 8 không gian, trừ khi bạn mở rộng các tab sang một thứ khác ngoài 8 khoảng trắng, trong trường hợp đó nó sẽ trông tệ trên các trình soạn thảo khác. Nếu bạn trộn các tab và dấu cách, nó có thể bị hỏng (xem câu hỏi) hoặc trông bị hỏng nếu bạn có các tab khác ngoài 8 không gian. Tóm lại: Sử dụng các tab để thụt lề là cực kỳ xấu. Không bao giờ làm điều đó bao giờ (ngoại trừ các định dạng ngôn ngữ / tệp yêu cầu nó). Kết thúc.
Lennart Regebro

2
@RocketR Python có Pep8, một tài liệu liệt kê "phong cách trăn tốt" trong đó nêu rõ rằng 4 khoảng trắng là hình thức được chấp nhận khi thụt lề.
Daniel Gratzer

4
Liên kết đến phần PEP 8 có liên quan trên spoiler "Tab vs Spaces" : dòng đầu tiên là "Spaces là phương pháp thụt đầu dòng ưa thích".
Tadhg McDonald-Jensen


43

Với trình chỉnh sửa IDLE, bạn có thể sử dụng:

  • Menu Chỉnh sửaChọn Tất cả
  • Định dạng menu → Vùng không xác định
  • Giả sử trình soạn thảo của bạn đã thay thế 8 khoảng trắng bằng một tab, hãy nhập 8 vào hộp nhập.
  • Nhấn select và nó sửa toàn bộ tài liệu.

15

Nếu bạn đang sử dụng Sublime Text để phát triển Python, bạn có thể tránh lỗi bằng cách sử dụng gói Anaconda. Sau khi cài đặt Anaconda, hãy mở tệp của bạn trong Sublime Text, nhấp chuột phải vào không gian mở → chọn Anaconda → nhấp vào autoformat. Xong rồi . Hoặc nhấn Ctrl+ Alt+ R.


12

Nói chung, mọi người thích thụt lề với không gian. Nó phù hợp hơn giữa các biên tập viên, dẫn đến ít sự không phù hợp của loại này. Tuy nhiên, bạn được phép thụt lề bằng tab. Đó là sự lựa chọn của bạn; tuy nhiên, bạn cần lưu ý rằng tiêu chuẩn 8 khoảng trống trên mỗi tab là hơi rộng.

Liên quan đến vấn đề của bạn, rất có thể, trình soạn thảo của bạn đã gây rối. Để chuyển đổi tab sang không gian thực sự phụ thuộc vào biên tập viên.

Ví dụ, trên Emacs, bạn có thể gọi phương thức 'unabify'.

Trên dòng lệnh, bạn có thể sử dụng một dòng sed (điều chỉnh số lượng khoảng trắng cho bất cứ điều gì làm bạn hài lòng):

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

9

Khi sử dụng trình soạn thảo văn bản cao siêu, tôi có thể chọn đoạn mã gây ra inconsistent use of tabs and spaces in indentationlỗi cho mình và chọn:

view > indentation > convert indentation to spaces

mà giải quyết vấn đề cho tôi.


8

Tôi đã làm gì khi cùng một lỗi xuất hiện: Chọn mọi thứ ( Str+ A) và nhấn Shift+Tab . Vì vậy, không có gì được thụt lề nữa. Bây giờ hãy quay lại các dòng bạn muốn thụt lề và đặt nó trở lại như bạn muốn.

Nó làm việc cho tôi ...


7

Gần đây tôi đã gặp vấn đề tương tự và phát hiện ra rằng tôi chỉ cần chuyển đổi bộ ký tự của tệp .py thành UTF-8 như bộ Python 3 sử dụng.

BTW, tôi đã sử dụng các tab 4 không gian mọi lúc, vì vậy vấn đề không phải do chúng gây ra.


6

Văn bản cao siêu 3

Trong Sublime Text, KHI chỉnh sửa một Python file:

Menu văn bản tuyệt vời > Tùy chọn > Cài đặt - Cú pháp cụ thể :

Cài đặt Python.sublime

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

5

Có thể giải quyết vấn đề này bằng notepad++cách thay thế Tabs bằng 4 Spaces:

  1. Chọn Tìm kiếm -> Tìm ... hoặc nhấn Ctrl+F
  2. Chọn Thay thế tab
  3. Trong hộp có tên Chế độ tìm kiếm, hãy mở rộng (\ n, \ r, \ t, \ 0, \ x ...)
  4. Trong trường Tìm cái gì: viết \ t
  5. Trong trường Thay thế bằng: nhấnSpace 4 lần. Hãy chắc chắn rằng không có gì khác trong lĩnh vực này.
  6. Bấm vào nút Thay thế Tất cả

Cách thay thế Tab bằng Spaces


3

Tôi đã có vấn đề này. Giải pháp: 'tab' của bạn trước dòng vấn đề là khoảng trắng, 4, 6 hoặc 8 khoảng trắng. Bạn nên xóa chúng và chèn TAB. '\ T'. Đó là tất cả.


Không nên sử dụng các ký tự TAB khi mã hóa bằng Python - đọc PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66

2

Tôi sử dụng Notepad ++ và gặp lỗi này.

Trong Notepad ++, bạn sẽ thấy cả tab và bốn khoảng trắng đều giống nhau, nhưng khi bạn sao chép mã của mình sang Python IDLE, bạn sẽ thấy sự khác biệt và dòng có một tab sẽ có nhiều khoảng trống hơn nó.

Để giải quyết vấn đề, tôi chỉ cần xóa tab trước dòng sau đó thêm bốn khoảng trắng.


2

Tôi đã có những lỗi giống nhau. Tôi đã phải thêm một số dòng mã vào tệp * .py hiện có. Trong Notepad ++, nó không hoạt động.

Sau khi thêm các dòng mã và lưu, tôi đã gặp lỗi tương tự. Khi tôi mở cùng một tệp trong PyCharm và thêm các dòng, lỗi đã biến mất.


1

Tôi đã nhận được các lỗi tương tự nhưng không thể tìm ra những gì tôi đã làm sai.

Vì vậy, tôi đã sửa nó bằng cách chạy tự động thụt vào mã của mình và cho phép máy sửa lỗi của tôi.

Nếu bất cứ ai đang tự hỏi làm thế nào tôi làm điều đó. Đơn giản. Đi vào vim. Nhập vào G = gg.

Điều này sẽ tự động sửa chữa mọi thứ. Chúc may mắn :)


1

Vấn đề của bạn là do giới hạn / cấu hình biên tập của bạn. Một số biên tập viên cung cấp cho bạn các công cụ để giải quyết vấn đề bằng cách:

  1. Chuyển đổi các tab thành không gian

    Ví dụ: nếu bạn đang sử dụng trình soạn thảo Python của Stani, bạn có thể định cấu hình nó để thực hiện việc lưu.

  2. Chuyển đổi không gian thành các tab

Nếu bạn đang sử dụng ActiveState Komodo, bạn có một công cụ để 'lập bảng' mã của mình. Như những người khác đã chỉ ra, đây không phải là một ý tưởng tốt.

Pydev của Eclipse cung cấp các hàm "Chuyển đổi các tab thành các tab không gian" và "Chuyển đổi các tab không gian thành các tab".


1

Nếu trình soạn thảo của bạn không nhận ra các tab khi thực hiện tìm kiếm và thay thế (như SciTE), bạn có thể dán mã vào Word và tìm kiếm bằng Ctr-H và ^ t tìm thấy các tab có thể thay thế bằng 4 khoảng trắng.


1

Có một bản sao của câu hỏi này từ đây nhưng tôi nghĩ rằng tôi sẽ đưa ra một quan điểm để làm với các biên tập viên hiện đại và hàng loạt các tính năng họ cung cấp. Với mã python, bất cứ thứ gì cần được đặt trong một .pytệp, tất cả đều phải được lấy bằng cách sử dụng phím tab hoặc bằng khoảng trắng. Công ước là sử dụng bốn không gian cho một vết lõm. Hầu hết các trình soạn thảo có khả năng hiển thị trực quan trên trình chỉnh sửa cho dù mã được thụt vào bằng dấu cách hoặc tab, điều này giúp ích rất nhiều cho việc gỡ lỗi. Ví dụ: với nguyên tử, đi đến tùy chọn và sau đó chỉnh sửa, bạn có thể thấy hai tùy chọn sau:

trình soạn thảo nguyên tử để hiển thị các tab và dấu cách

Sau đó, nếu mã của bạn đang sử dụng khoảng trắng, bạn sẽ thấy các chấm nhỏ nơi mã của bạn được thụt vào:

nhập mô tả hình ảnh ở đây

Và nếu nó được thụt lề bằng các tab, bạn sẽ thấy một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây

Bây giờ nếu bạn nhận thấy, bạn có thể thấy rằng khi sử dụng các tab, có nhiều lỗi / cảnh báo ở bên trái, điều này là do một thứ gọi là tài liệu pep8 pep8 , về cơ bản là một hướng dẫn kiểu thống nhất cho python, do đó tất cả các nhà phát triển chủ yếu viết mã cùng tiêu chuẩn và ngoại hình, giúp ích khi cố gắng hiểu mã người khác, đó là trong pep8, nơi ưu tiên sử dụng khoảng trắng để thụt lề thay vì các tab. Và chúng ta có thể thấy trình soạn thảo cho thấy có một cảnh báo liên quan đến mã cảnh báo pep8 W191,

Tôi hy vọng tất cả những điều trên giúp bạn hiểu bản chất của vấn đề bạn đang gặp phải và cách phòng ngừa trong tương lai.


0

Đôi khi, tabkhông gây rối trong khi thụt lề. Một cách rõ ràng là sử dụng tabbackspace thụt mã chính xác.

Một cách khác là sử dụng space 4 lần (tùy thuộc vào mức độ bạn muốn thụt lề).

Một cách kỳ lạ có hiệu quả với tôi khi không có gì khác hoạt động, bất kể dòng nào tôi gặp lỗi, tôi chuyển backspaceddòng đó sang dòng trước và sau đó nhấnenter . Nó tự động thụt dòng vào vị trí chính xác và tôi đã không nhận được bất kỳ lỗi nào sau đó.

Hy vọng, điều này sẽ giúp.


0

Tôi đã có cùng một vấn đề và khắc phục nó bằng cách sử dụng kịch bản python. hy vọng nó sẽ giúp người khác

đó là do sử dụng các tab và khoảng trắng để mã thụt lề. trong kịch bản này, tôi thay thế mỗi tab bằng bốn khoảng trắng.

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)

nếu bạn sử dụng cao siêu hoặc bất kỳ trình chỉnh sửa nào cung cấp cho bạn công cụ để thay thế văn bản, bạn có thể thay thế tất cả các tab bằng bốn khoảng trắng từ trình chỉnh sửa.


0

Sử dụng, Idle cho python hoặc Idle3 cho python3.


2
Một chút chi tiết về cách thức / lý do tại sao điều này làm việc cho bạn sẽ có ích.
TASlim Oseni

Vấn đề là do các tab thay vì không gian trong khu vực. Nhàn rỗi có thể hủy bỏ toàn bộ khu vực và khắc phục sự cố (Chỉ cần chọn Không xác định từ Định dạng Menu).
simc

0

Giải quyết vấn đề này bằng trình soạn thảo Vim

  1. Mở thiết bị đầu cuối ( Ctrl+ Alt+ T).
  2. Chuyển đến thư mục chứa tệp ( cd <path_to_your_directory>). Vd : cd /home/vineeshvs/work.
  3. Mở tệp trong Vim ( vim <file_name>). Vd : vim myfile.txt.
  4. [Bước tùy chọn] Bật đánh dấu từ khóa tìm kiếm trong Vim ( ESC :set hlsearch)
  5. Đi đến dòng mà bạn có vấn đề này ( ESC :<line_number>). Ví dụ: :53trong trình chỉnh sửa Vim sau khi nhấn ESCnút một lần.
  6. Thay thế các tab bằng cách sử dụng số lượng khoảng trắng cần thiết trong Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Ví dụ: Tab sẽ được thay thế bằng bốn khoảng trắng bằng lệnh :.,$s/\t/ /gcsau : sau khi nhấn ESC nút một lần). Quá trình này là tương tác. Bạn có thể đưa ra yđể thay thế tab bằng dấu cách và nbỏ qua một thay thế cụ thể. Nhấn ESCkhi bạn hoàn thành với các thay thế cần thiết.

0

Tôi kỳ lạ gặp phải một vấn đề tương tự với một trong các tệp .py của mình. Tôi chỉ cần mở tệp trong Pycharm và nhấn Option+ Command+ Lđể định dạng chính xác nội dung tệp trong một lần.

Tôi nghi ngờ mình gặp rắc rối vì tôi đã mã hóa tệp .py đặc biệt này thông qua các phòng thí nghiệm jupyter trái ngược với lựa chọn thông thường của tôi về văn bản cao siêu hoặc Pycharm và do đó gặp phải một số vấn đề thụt lề ẩn mà nhiều câu trả lời ở đây đã ám chỉ


0

Vâng, tôi đã có cùng một vấn đề và tôi nhận ra rằng vấn đề là tôi đã sao chép mã từ một trình soạn thảo python khác để thăng hoa.

Tôi đã làm việc với máy tính xách tay jupyter và sau đó tôi đã sao chép mã thành tuyệt vời. Rõ ràng khi bạn thực hiện các sửa đổi cụ thể (như di chuyển mã trong các hàm) thì việc thụt lề trở nên lộn xộn và đây là vấn đề xuất phát.

Vì vậy, chỉ cần dính vào một biên tập viên. Nếu bạn làm như vậy, thì bạn sẽ không gặp vấn đề gì.


0

Sử dụng pylintnó sẽ cung cấp cho bạn một báo cáo chi tiết về bao nhiêu không gian bạn cần và ở đâu.


0

Nếu bạn sử dụng ATOM:

Chuyển đến Menu: Gói -> WhiteSpace -> Chuyển đổi tất cả các Tab thành Spaces


0

Hãy thử xóa các vết lõm và sau đó nhấn một cách có hệ thống hoặc nhấn phím cách 4 lần. Điều này thường xảy ra với tôi khi tôi có một thụt lề bằng cách sử dụng phím tab và sau đó sử dụng phím cách ở dòng tiếp theo.


-2

Đánh dấu các bit thụt lề, rồi bấm vào tab. Sau đó họ sẽ trở nên nhất quán :)


2
Điều này mâu thuẫn với PEP 8 , hướng dẫn kiểu Python chuẩn, đề xuất 4 khoảng trắng. Tư vấn cho mọi người sử dụng các tab không nhất quán hơn.
Aurora0001

không đề cập đến việc nếu cộng tác viên của mã này đang sử dụng PEP8 sẽ gặp lỗi tương tự
Thomas Matthew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.