Câu hỏi Có cách nào để chuyển đổi thụt đầu dòng trong mã Python thành niềng răng?


Tôi là một lập trình viên mù hoàn toàn muốn học Python. Thật không may thực tế là các khối mã được biểu diễn với các mức thụt đầu dòng khác nhau là một trở ngại lớn. Tôi đã tự hỏi nếu có bất kỳ công cụ có sẵn mà sẽ cho phép tôi viết mã bằng cách sử dụng dấu ngoặc hoặc một số dấu phân cách khối mã khác và sau đó chuyển đổi định dạng đó thành biểu diễn thụt lề đúng cách mà trình thông dịch Python có thể sử dụng?


76
2017-09-23 01:33


gốc


Ngoài sự tò mò, bạn đang sử dụng hệ điều hành nào? - Ryan
Nhưng, tại sao không gian và đường dây phá vỡ một vấn đề. Không phải là nó có thể làm cho người đọc văn bản nói những ký tự không thể in được? - e-satis
Điều đó có vẻ giống như một công thức cho thảm họa - Tôi không biết nhiều người muốn nghe "không gian vũ trụ space space space space space foo" trước mỗi dòng. - javawizard
@javawizard nó có thể hoạt động bằng cách nói "def foo colon, next line, tăng thụt đầu dòng, ..." hoặc "indent level 0, def foo colon, dòng tiếp theo indent level 1, ..." - smoothdeveloper
@smoothdeveloper Tuyệt đối, và đó là câu hỏi của người đăng. - javawizard


Các câu trả lời:


Có một giải pháp cho vấn đề của bạn được phân phối với chính python. pindent.py, nó nằm trong thư mục Tools \ Scripts trong một cửa sổ cài đặt (đường dẫn đến nó là C: \ Python25 \ Tools \ Scripts), có vẻ như bạn đã lấy nó từ svn.python.org nếu bạn đang chạy trên Linux hoặc OSX.

Nó cho biết thêm các bình luận khi các khối được đóng lại, hoặc có thể thụt lề mã đúng nếu các bình luận được đưa vào. Đây là một ví dụ về mã được xuất ra bởi lệnh pindent bằng lệnh:

pindent -c myfile.py

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
       # end if
   else:
       print 'oops!'
   # end if
# end def foobar

Nơi gốc myfile.py là:

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
   else:
       print 'oops!'

Bạn cũng có thể dùng pindent.py -d để chèn thụt lề chính xác dựa trên các chú thích (đọc tiêu đề của pindent.py để biết chi tiết), điều này sẽ cho phép bạn viết mã trong python mà không cần lo lắng về thụt đầu dòng.

Tôi muốn được quan tâm để tìm hiểu những gì giải pháp bạn kết thúc bằng cách sử dụng, nếu bạn cần bất kỳ sự trợ giúp thêm, xin vui lòng bình luận về bài đăng này và tôi sẽ cố gắng giúp đỡ.


53
2017-09-23 02:04





Python hỗ trợ niềng răng để xác định các khối mã, và nó cũng hỗ trợ sử dụng các thẻ 'bắt đầu' và 'kết thúc'.

Vui lòng xem các ví dụ mã sau:

class MyClass(object): #{
    def myfunction(self, arg1, arg2): #{
        for i in range(arg1): #{ 
            print i
        #}
    #}
#}

Và một ví dụ với phong cách bash:

fi = endclass = enddef = endclass = done = None
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1): #do
            if i > 5: #then
                print i
            fi
        done
    enddef
endclass

Điều tốt nhất về điều này là bạn có thể quên đặt một dấu đóng vào, và nó vẫn là con trăn hợp lệ!

class MyClass(object): #{
    def myfunction(self, arg1, arg2): #{
        for i in range(arg1): #{ 
            print i
        # whoops, forgot to close that bracket!
    #}
#}

gốc gag

Lời khuyên thực sự của tôi là để có được một màn hình chữ nổi nếu bạn có thể đủ khả năng một / nguồn một - lập trình viên python mù của người quen của tôi thực sự tìm thấy một màn hình chữ nổi không thể thiếu cho việc viết các chương trình python, nó làm cho điều indentation ít đau đớn hơn nhiều. Một màn hình 40 cell cũng đáng giá.


24
2017-09-23 02:02



@rsenna Không có gì là "độc ác" hay "lạm dụng" về câu trả lời này. Xin vui lòng đọc Cac hương dân về những gì cấu thành nội dung xúc phạm trên Stack Overflow. Nếu bạn có thêm câu hỏi hoặc nhận xét, vui lòng xem xét đăng lên meta; các bình luận bên dưới một câu hỏi không phải là một nơi thích hợp để thảo luận liên tục. - meagar♦
Câu trả lời này có thể không "tàn nhẫn hoặc lạm dụng", nhưng tôi vẫn ngạc nhiên rằng gần 30 người nghĩ rằng đó là một tốt trả lời giá trị upvoting. Các trò đùa của thậm chí không ban đầu! Có một sự khác biệt lớn giữa việc tạo ra niềm vui của mọi người bởi vì họ quen với C / Java / Pascal / Fortran / v.v mà họ không cảm thấy thoải mái khi làm mọi thứ theo bất kỳ cách nào khác và làm cho họ vui vẻ bởi vì họ mù và thực sự gặp rắc rối với cú pháp thụt lề cú pháp, nó có thể không xứng đáng với một lá cờ "xúc phạm", nhưng tôi vẫn thấy nó có vị hơi kém, ít nhất.) - Ilmari Karonen


Cá nhân tôi nghi ngờ rằng hiện tại đang có lúc này, vì rất nhiều các hiệu ứng Python thích thực tế rằng Python là cách này, khoảng trống được phân tách.

Tôi đã không bao giờ thực sự nghĩ về điều đó như là một vấn đề khả năng tiếp cận tuy nhiên. Có lẽ nó là một cái gì đó để đưa ra như là một báo cáo lỗi cho Python?

Tôi giả sử rằng bạn sử dụng một trình đọc màn hình ở đây tuy nhiên cho đầu ra? Vì vậy, các tab sẽ có vẻ "vô hình" với bạn? Với đầu ra chữ nổi, nó có thể dễ đọc hơn, nhưng tôi có thể hiểu chính xác điều này có thể gây nhầm lẫn như thế nào.

Thực tế, điều này rất thú vị đối với tôi. Tôi ước rằng tôi biết đủ để có thể viết một ứng dụng sẽ làm điều này cho bạn.

Tôi nghĩ rằng nó chắc chắn là một cái gì đó mà tôi sẽ đưa vào một báo cáo lỗi cho, trừ khi bạn đã làm như vậy cho mình, hoặc muốn.

Chỉnh sửa: Ngoài ra, như lưu ý bởi John Millikin Cũng có PyBraces Đó có thể là giải pháp khả thi đối với bạn và có thể bị tấn công cùng nhau phụ thuộc vào kỹ năng mã hóa của bạn chính xác những gì bạn cần (và tôi hy vọng rằng nếu đó là trường hợp, bạn giải phóng nó cho những người khác như bạn sử dụng)

Chỉnh sửa 2: Tôi vừa mới báo cáo điều này để theo dõi lỗi python


10
2017-09-23 01:35





Mặc dù tôi không mù, tôi đã nghe những điều tốt đẹp về Emacspeak. Họ đã có một chế độ Python từ Bản phát hành 8.0 vào năm 1998 (có vẻ như họ sẽ phát hành 28.0!). Chắc chắn đáng để kiểm tra.


9
2017-09-23 01:51





Bạn có thể định cấu hình trình chỉnh sửa của mình để nói các tab và dấu cách - tôi biết có thể trưng bày khoảng trắng trong hầu hết các trình chỉnh sửa, vì vậy phải có tùy chọn trợ năng ở đâu đó để nói chúng.

Nếu không, có pybraces, được viết như một trò đùa thực tế nhưng thực sự có thể hữu ích cho bạn với một chút công việc.


6
2017-09-23 01:38



Tuy nhiên, bạn phải suy nghĩ về thực tế là tại một thời điểm nhất định, việc ghi nhớ nơi bạn đang ở trong một khối mã phụ thuộc vào các tab sẽ khó khăn. Niềng răng đánh dấu một điểm bắt đầu và kết thúc cụ thể, trong khi với các tab, nó có thể gây nhầm lẫn (tôi bị lẫn lộn với nó và tôi được nhìn thấy!) - Mez


Nếu bạn đang sử dụng Windows, tôi khuyên bạn nên xem EdSharp từ: http://empowermentzone.com/EdSharp.htm Nó hỗ trợ tất cả các trình đọc Windows hàng đầu, nó có thể được cấu hình để nói mức độ thụt đầu dòng, hoặc nó có một tiện ích được xây dựng có tên PyBrace có thể chuyển đổi thành và từ cú pháp niềng răng nếu bạn muốn thực hiện điều đó, và nó hỗ trợ tất cả các loại lập trình viên có tính năng khác đã mong đợi trong trình chỉnh sửa văn bản của chúng tôi. Tôi đã sử dụng nó trong nhiều năm, cho tất cả mọi thứ từ PHP sang JavaScript để HTML sang Python, và tôi thích nó.


6
2017-11-08 15:40



Tôi đã sử dụng nó như là biên tập viên chính của tôi trong năm qua. - Jared


Tôi đánh giá cao vấn đề của bạn, nhưng nghĩ rằng bạn đang xác định việc thực hiện thay vì vấn đề bạn cần giải quyết. Thay vì chuyển đổi sang niềng răng, làm thế nào về cách làm việc trên một cách để người đọc màn hình của bạn cho bạn biết mức độ thụt đầu dòng?

Ví dụ, một số người đã làm việc trên màu cú pháp vim để đại diện cho mức thụt lề python. Có lẽ một màu cú pháp sửa đổi có thể tạo ra thứ gì đó mà trình đọc màn hình của bạn sẽ đọc?


4
2017-09-23 01:43



"cấp 4 thụt đầu dòng" foo bằng thanh mới "mức độ thụt đầu dòng 3" Thật khó hiểu, và phải theo dõi điều đó trong tâm trí của bạn là một gánh nặng thêm. - Mez
Không phải là "N mức độ thụt đầu dòng", "trong" so với "ngoài" hoặc "thụt lề" so với "khấu trừ" là đủ. def foo (x): indent return x * 2 dedent - kaleissin


Tất cả những câu trả lời "không bạn không thể" này đều thực sự gây phiền nhiễu. Tất nhiên bạn có thể.

Đó là một hack, nhưng bạn có thể làm điều đó.

http://timhatch.com/projects/pybraces/

sử dụng mã hóa tùy chỉnh để chuyển đổi các dấu ngoặc nhọn thành các khối thụt lề trước khi giao cho người phiên dịch.


Là một sang một bên, và như một người mới để trăn - Tôi không chấp nhận lý do đằng sau thậm chí không cho phép niềng răng / dấu phân cách khối chung ... ngoài việc đó là sở thích của các nhà phát triển python. Niềng răng ít nhất sẽ không bị ăn vô tình nếu bạn đang làm một số xử lý tự động mã của bạn hoặc làm việc trong một trình soạn thảo mà không hiểu rằng không gian màu trắng là quan trọng. Nếu bạn đang tạo mã tự động, thật thuận tiện để không phải theo dõi các mức thụt lề. Nếu bạn muốn sử dụng python để làm một perl-esque một lớp lót, bạn sẽ tự động bị tê liệt. Nếu không có gì khác, giống như một biện pháp bảo vệ. Điều gì nếu chương trình python 1000 dòng của bạn được tất cả các tab của nó ăn? Bạn đang đi để đi từng dòng và tìm ra nơi indenting nên được?

Hỏi về nó sẽ luôn nhận được một phản ứng lưỡi-trong-má như "chỉ cần làm" từ __ tương lai __ nhập khẩu niềng răng '"," cấu hình IDE của bạn một cách chính xác "," nó tốt hơn anyway để làm quen với nó "...

Tôi thấy điểm của họ, nhưng hey, nếu tôi muốn, tôi có thể đặt một dấu chấm phẩy sau mỗi dòng. Vì vậy, tôi không hiểu tại sao tất cả mọi người rất kiên quyết về điều niềng răng. Nếu bạn cần ngôn ngữ của bạn để buộc bạn phải thụt lề đúng cách, bạn không làm điều đó ngay từ đầu.

Chỉ cần 2c của tôi - tôi sẽ sử dụng niềng răng anyway.


4
2017-07-08 09:42



bạn cần phải mở một shell python và nhập: import this - ThatAintWorking
Thật vậy, ý kiến ​​của tôi đã bị ảnh hưởng qua kinh nghiệm. Tôi đã cố gắng tìm cách để buộc python phải phù hợp với nhu cầu của một trong các dự án của tôi và đã thất vọng khi thấy rằng nó từ chối làm như vậy bằng bất kỳ phương tiện thuyết phục nào. Tôi đã đi từ nó từ một góc độ khác nhau và đã tìm thấy python là một nền tảng đẹp và rất hợp tác để làm việc. Bài học chính tôi đã học được là giá rẻ hacks và máy tính không pha trộn tốt. Tôi đã phải thực hiện một số nghiên cứu chuyên sâu về các thuật toán phân tích cú pháp, nhưng kiến ​​thức tôi đã đạt được cũng rất đáng giá. Tôi vẫn không quan tâm đến thụt lề / suy luận, nhưng tôi tôn trọng họ. - la11111