Cách sửa lỗi thụt Python


264

Tôi có một số mã Python có thụt đầu dòng không nhất quán. Có rất nhiều hỗn hợp của các tab và không gian để làm cho vấn đề trở nên tồi tệ hơn, và thậm chí thụt không gian không được bảo tồn.

Mã này hoạt động như mong đợi, nhưng rất khó để duy trì.

Làm cách nào tôi có thể sửa lỗi thụt lề (như HTML Tidy , nhưng đối với Python) mà không vi phạm mã?


bạn có thể xem lại liên kết này và cung cấp thông tin đầu vào của bạn về cách sử dụng mô đun reindent.py-- stackoverflow.com/questions/12132481/installing-reindent-python/
Lỗi

Như được đề cập dưới đây bởi @ andy-hayden, hãy xem câu hỏi liên quan này - về cơ bản autopep8cung cấp sự thụt lề và nhiều hơn nữa: stackoverflow.com/questions/14328406/
Lỗi

2
Đây là một câu hỏi cực kỳ hữu ích, tôi thấy mình cần phải làm điều này khá thường xuyên. Đây không phải là "giới thiệu một công cụ" nhiều như "làm thế nào để làm điều đó".
Andy Hayden

Câu trả lời:


282

Sử dụng reindent.pytập lệnh mà bạn tìm thấy trong Tools/scripts/thư mục cài đặt Python của bạn:

Thay đổi tệp Python (.py) để sử dụng thụt lề 4 không gian và không có ký tự tab cứng. Đồng thời cắt các khoảng trống và tab thừa từ cuối dòng và xóa các dòng trống ở cuối tệp. Cũng đảm bảo dòng cuối cùng kết thúc với một dòng mới.

Có một cái nhìn vào kịch bản để biết hướng dẫn sử dụng chi tiết.


51
Thật không may, nó không phải là một phần của cài đặt Python bình thường trên Debian và Ubuntu; nó được chia thành các python-examplesgói.
ephemient

16
Thông minh! Vì vậy, tất cả những gì người dùng Debian và Ubuntu cần làm là để có được gói đó. Ngoài ra, tập lệnh cũng có tại svn.python.org/view/python/trunk/Tools/scripts/ .
Alex Martelli

9
@Shay Erlichmen: Hãy thử "python -tt yourcript.py"
nosklo

8
Người dùng Fedora / RedHat / CentOS nên cài đặt gói "python-tools".
Cristian Ciupitu

26
Chỉ cần thêm vào nhận xét của python-examplesephemient : một khi được cài đặt, bạn sẽ thấy tuần lộc /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings

59

Nếu bạn đang sử dụng Vim , xem :h retab.

                                                        *: ret * *: retab *
: [phạm vi] ret [ab] [!] [new_tabstop]
                        Thay thế tất cả các chuỗi khoảng trắng chứa
                        <Tab> với các chuỗi khoảng trắng mới bằng cách sử dụng mới
                        giá trị tabstop đưa ra. Nếu bạn không chỉ định mới
                        kích thước tabstop hoặc bằng 0, Vim sử dụng giá trị hiện tại
                        của "tabstop".
                        Giá trị hiện tại của 'tabstop' luôn được sử dụng để
                        tính chiều rộng của các tab hiện có.
                        Với !, Vim cũng thay thế các chuỗi chỉ bình thường
                        không gian với các tab khi thích hợp.
                        Khi bật 'extendtab', Vim thay thế tất cả các tab bằng
                        số lượng không gian thích hợp.
                        Lệnh này đặt 'tabstop' thành giá trị mới đã cho,
                        và nếu được thực hiện trên toàn bộ tệp, đó là mặc định,
                        không nên thực hiện bất kỳ thay đổi có thể nhìn thấy.
                        Cẩn thận: Lệnh này sửa đổi bất kỳ ký tự <Tab> nào
                        bên trong các chuỗi trong một chương trình C. Sử dụng "\ t" để tránh
                        Điều này (dù sao đó cũng là một thói quen tốt).
                        ": retab!" cũng có thể thay đổi một chuỗi các không gian bằng cách
                        Các ký tự <Tab>, có thể làm rối một printf ().
                        {không ở Vi}
                        Không khả dụng khi | + ex_extra | tính năng đã bị vô hiệu hóa tại
                        thời gian biên dịch.

Ví dụ, nếu bạn chỉ cần gõ

:

tất cả các tab của bạn sẽ được mở rộng vào không gian.

Bạn có thể muốn

: se et "tốc ký cho: thiết lập exttab

để đảm bảo rằng bất kỳ dòng mới nào sẽ không sử dụng các tab theo nghĩa đen.


Nếu bạn không sử dụng Vim,

perl -i.bak -pe "s / \ t / '' x (8-pos ()% 8) / eg" file.py

sẽ thay thế các tab bằng dấu cách, giả sử tab dừng mỗi 8 ký tự, trong file.py(với trường hợp ban đầu sẽ đến file.py.bak, chỉ trong trường hợp). Thay thế 8 giây bằng 4s nếu thay vào đó, mỗi tab của bạn dừng lại là 4 khoảng trắng.


2
Làm việc tốt. Đây là cách dễ nhất để sửa lỗi trộn thụt tab.
Srikant

Để chắc chắn không phải là cách dễ nhất.
CONvid19

52

Tôi sẽ với tới autopep8 để làm điều này:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Lưu ý: E101 và E121 là thụt đầu dòng pep8 (Tôi nghĩ rằng bạn có thể đơn giản vượt qua --select=E1để khắc phục tất cả các vấn đề liên quan đến thụt lề - những vấn đề bắt đầu với E1).

Bạn có thể áp dụng điều này cho toàn bộ dự án của mình bằng cờ đệ quy:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Xem thêm Công cụ để chuyển đổi mã Python thành tuân thủ PEP8 .


điều này thật tuyệt vời ... Tôi đã tìm kiếm một công cụ như rubocop của ruby ​​cho trăn
OkezieE

1
autopep8thất bại nếu cú ​​pháp không chính xác. bạn có thể xác nhận rằng bằng cách sử dụngpython -tt <file.py>
Nishant

47

autopep8 -i script.py

Sử dụng autopep8

autopep8 tự động định dạng mã Python để phù hợp với PEP 8 nullstylehướng dẫn. Nó sử dụng pep8tiện ích để xác định phần nào của nullcodenhu cầu được định dạng. autopep8có khả năng khắc phục hầu hết các nullformattingvấn đề có thể được báo cáo bởi pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

tôi chỉ có một mã dòng với "nhập os" và 4 dấu cách trước nó nhưng nó không thụt vào đó .... bất kỳ lý do nào
pkm

3
@pkm 4 khoảng trắng (hoặc bất kỳ sự cố định nào là bội số của 4) là một phần của PEP8
rbaleksandar

13

Sử dụng Vim, không nên tham gia nhiều hơn là nhấn Escvà sau đó nhập ...

:%s/\t/    /g

... Trên tập tin bạn muốn thay đổi. Điều đó sẽ chuyển đổi tất cả các tab thành bốn không gian. Nếu bạn có khoảng cách không nhất quán là tốt, thì điều đó sẽ khó khăn hơn.


11
bạn có thể theo dõi (các) lập trình viên gốc và áp dụng các kỹ thuật thẩm vấn nâng cao không? Không có gì tệ hơn là mã thụt vào không nhất quán.
Ben Hughes

3
@Ben Sự cố ý không nhất quán là vấn đề ít nhất của chúng tôi từ anh chàng đó :)
Shay Erlichmen

9

Ngoài ra còn có PythonTidy (vì bạn nói bạn thích HTML Tidy).

Nó có thể làm nhiều hơn là chỉ làm sạch các tab. Nếu bạn thích kiểu đó, nó đáng để xem.


5

Trên hầu hết các hệ thống giống như UNIX, bạn cũng có thể chạy:

expand -t4 oldfilename.py > newfilename.py

từ dòng lệnh, thay đổi số nếu bạn muốn thay thế các tab bằng một số khoảng trắng khác 4. Bạn có thể dễ dàng viết một tập lệnh shell để làm điều này với một loạt các tệp cùng một lúc, giữ lại tên tệp gốc.


1
Lưu ý rằng việc sử dụng cùng một tệp không hoạt động và để lại cho bạn một tệp trống, nhưng câu trả lời này thực sự hoạt động và tôi sử dụng nó khi tôi cần chuyển đổi các tab của mình thành khoảng trắng. Bất cứ ai có thể giải thích các downvote? Tôi sẽ tăng nó +1.
S. Kerdel

Có cách nào có thể để phục hồi tập tin bị ghi đè không? Chỉ cần sử dụng phương pháp trên và giá trị mã ngày của tôi biến mất facepalm . Cảm ơn
Simas

4

Nếu bạn lười biếng (như tôi), bạn cũng có thể tải xuống phiên bản dùng thử của Wingware Python IDE, có công cụ sửa lỗi tự động để gây ra sự thụt lề. Nó hoạt động khá tốt. http://www.wingware.com/


4

Kịch bản tuần lộc không hoạt động đối với tôi, do một số mô-đun bị thiếu. Dù sao, tôi đã tìm thấy sedlệnh này thực hiện công việc hoàn hảo cho tôi:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
Tùy chọn bất hợp pháp -r.
HelloWorld

2

Hãy thử Emacs. Nó có hỗ trợ tốt cho việc thụt lề cần thiết trong Python. Vui lòng kiểm tra liên kết này http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htmlm


2
Chế độ python rất tốt để viết Python, nhưng không có gì trong liên kết mô tả cách khắc phục thụt lề trong một tệp hiện có.
ephemient

5
Mx unsabify sẽ biến các tab thành không gian trong emacs
Paul Hildebrandt

Các liên kết là (có hiệu quả) bị hỏng. Nó chuyển hướng đến một trang có tiêu đề "Ngôn ngữ lập trình C cho người mới bắt đầu" (!).
Peter Mortensen


0

Tôi có một giải pháp đơn giản cho vấn đề này. Trước tiên bạn có thể gõ ": retab" và sau đó ": retab!", Sau đó mọi thứ sẽ ổn


1
Nhập " :retab" trong bối cảnh nào. Ở Vim ?
Peter Mortensen

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.