Có cách nào để chuyển đổi thụt lề trong mã Python thành dấu ngoặc nhọn không?


81

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 lề khác nhau là một trở ngại lớn. Tôi đã tự hỏi liệu có bất kỳ công cụ nào có sẵn cho phép tôi viết mã bằng cách sử dụng dấu ngoặc nhọn 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 một biểu diễn thụt lề thích hợp mà trình thông dịch Python có thể sử dụng không?


Không khỏi tò mò, bạn đang sử dụng hệ điều hành nào?
Ryan

4
Nhưng, tại sao khoảng trắng và ngắt dòng là một vấn đề. Không thể làm cho trình đọc văn bản nói các ký tự không in được?
e-thoả mãn 23/09/08

2
Đó có vẻ như là 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 không gian không gian không gian không gian không gian không gian không gian không gian def foo" trước mỗi dòng.
javawizard

@javawizard nó có thể làm việc bằng cách nói "ruột foo def, dòng tiếp theo, tăng thụt đầu dòng, ..." hoặc "thụt lề mức 0, def foo ruột kết, dòng tiếp theo thụt cấp 1, ..."
smoothdeveloper

@smoothdeveloper Hoàn toàn có thể, và đó là câu hỏi của người đăng bài.
javawizard

Câu trả lời:


56

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

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

pindent.py -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

Bản gốc ở đâu myfile.py:

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ể sử dụng pindent.py -rđể chèn thụt lề chính xác dựa trên nhận xét (đọ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ã bằng python mà không phải lo lắng về việc thụt lề.

Ví dụ: chạy pindent.py -r myfile.pysẽ chuyển đổi mã sau myfile.pythành cùng một mã được thụt lề đúng cách (và cũng được chú thích) như được tạo bởi pindent.py -cví dụ trên:

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

Tôi muốn tìm hiểu xem bạn sẽ sử dụng giải pháp nào, nếu bạn cần thêm bất kỳ hỗ trợ nào, hãy bình luận về bài đăng này và tôi sẽ cố gắng trợ giúp.


Phản đối: Điều này có thể hữu ích với việc đọc mã, nhưng nó không giúp ích cho việc viết nó. Python và các ngôn ngữ như nó chỉ phụ thuộc vào khoảng cách để biểu thị lồng nhau vốn dĩ đã bị hỏng khi nói đến khả năng tiếp cận cho người mù. Một công cụ thực hiện đảo ngược pindentmã bên trái (sơ đồ thụt lề ưa thích của nhiều lập trình viên mù) thể hữu ích. Sẽ hữu ích hơn from __future__ import braces- nhưng không phải như một quả trứng Phục sinh.
David Hammen

1
@DavidHammen: Có một công cụ thực hiện các nghịch đảo của pindent.py -c; nó pindent.py -r. Ryan đã lưu ý điều đó trong câu trả lời của họ, nhưng tôi chỉ chỉnh sửa nó để thêm một ví dụ rõ ràng và khó bỏ sót hơn. (Ngoài ra, tôi đã sửa tùy chọn dòng lệnh để làm điều đó: nó -r, không -dchỉ xóa các nhận xét.)
Ilmari Karonen

11

Cá nhân tôi nghi ngờ rằng hiện tại là ở thời điểm hiện tại, vì rất nhiều người yêu thích Python thích thực tế rằng Python là theo cách này, được phân cách bằng khoảng trắng.

Tuy nhiên, tôi chưa bao giờ thực sự nghĩ về điều đó như một vấn đề trợ năng. Có lẽ đó là thứ cần đưa ra dưới dạng báo cáo lỗi cho Python?

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

Trong 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 có thể làm điều này cho bạn.

Tôi nghĩ chắc chắn đó là thứ mà tôi sẽ đưa vào báo cáo lỗi, trừ khi bạn đã tự làm như vậy hoặc muốn.

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

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


9

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


6

Bạn sẽ có thể định cấu hình trình chỉnh sửa của mình để đọc các tab và khoảng trắng - Tôi biết có thể hiển thị 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.

Không đạt được điều đó, 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.


2
Tuy nhiên, bạn phải nghĩ đến thực tế rằng tại một thời điểm nhất định, việc ghi nhớ vị trí của bạn trong một khối mã phụ thuộc vào các tab sẽ rất khó. Dấu ngoặc nhọn đánh dấu một điểm đánh dấu 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ị nhầm lẫn với nó và tôi đã nhìn thấy!)
Mez

6

Nếu bạn đang sử dụng Windows, tôi thực sự 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 màn hình hàng đầu của Windows, nó có thể được cấu hình để nói các mức độ thụt lề của mã, hoặc nó có một tiện ích tích hợp tên là PyBrace có thể chuyển đổi sang và từ cú pháp dấu ngoặc nhọn nếu bạn muốn làm điều đó thay thế và nó hỗ trợ tất cả các loại tính năng khác mà các lập trình viên đã mong đợi trong trình soạn thảo văn bản của chúng tôi. Tôi đã sử dụng nó trong nhiều năm, cho mọi thứ từ PHP đến JavaScript, HTML sang Python, và tôi thích nó.


Tôi đã sử dụng nó làm trình soạn thảo chính của mình trong khoảng năm ngoái.
Jared

4

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

Ví dụ: một số người đã làm việc trên màu cú pháp vim để thể hiện mức thụt lề của 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?


"thụt đầu dòng cấp độ 4" foo bằng thanh mới "thụt lề cấp độ 3" Thật khó hiểu, và việc phải theo dõi điều đó trong tâm trí bạn là một gánh nặng thêm.
Mez 23/09/08

1
Không phải "thụt lề cấp N", "vào" so với "ra" hoặc "thụt lề" so với "suy ra" là đủ. def foo (x): thụt trở lại x * 2 dedent
kaleissin

4

Tất cả những câu trả lời kiểu "không, không thể" này thực sự rất khó chịu. Tất nhiên bạn có thể.

Đó là một cuộc tấn công, nhưng bạn có thể làm được.

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 vào trước khi chuyển nó cho trình thông dịch.


Ngoài ra, với tư cách là một người mới sử dụng python - tôi không chấp nhận lý do đằng sau việc không cho phép dấu ngoặc nhọn / 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. Các dấu ngoặc nhọn ít nhất sẽ không vô tình bị ăn nếu bạn đang thực hiện một số xử lý tự động mã của mình hoặc làm việc trong trình soạn thảo mà không hiểu rằng khoảng trắng là quan trọng. Nếu bạn đang tạo mã tự động, thật tiện lợi khi không phải theo dõi các mức thụt lề. Nếu bạn muốn sử dụng python để tạo một lớp lót perl-esque, bạn sẽ tự động bị tê liệt. Nếu không có gì khác, chỉ như một biện pháp bảo vệ. Điều gì sẽ xảy ra nếu chương trình python 1000 dòng của bạn bị ăn hết các tab của nó? Bạn sẽ đi từng dòng một và tìm ra vị trí nên thụt lề?

Hỏi về nó sẽ luôn nhận được câu trả lời như "just do" from __ future __ import niềng răng "," định cấu hình IDE của bạn một cách chính xác "," dù sao cũng tốt hơn nên hãy làm quen với nó "...

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

Chỉ là 2c của tôi - Dù sao thì tôi cũng sẽ niềng răng.


bạn cần phải mở một shell python và nhập: nhập khẩu này
ThatAintWorking

1
Thật vậy, ý kiến ​​của tôi đã bị ảnh hưởng bởi kinh nghiệm. Tôi đang 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 những dự án của tôi và rất thất vọng khi thấy rằng nó từ chối làm như vậy bằng bất kỳ cách nào để thuyết phục. Tôi đã xem xét nó từ một góc độ khác và nhận thấy python là một nền tảng tuyệt đẹp và có tính hợp tác cao để làm việc. Bài học chính mà tôi học được là các bản hack giá rẻ và máy tính không kết hợp tốt với nhau. 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 thu được rất đáng giá. Tôi vẫn không quan tâm đến việc thụt lề / thụt lề, nhưng tôi tôn trọng chúng.
la11111

4

Tìm kiếm một IDE Python có thể truy cập, đã tìm thấy điều này và quyết định trả lời. Trong Windows với JAWS:

  1. Đi tới Trung tâm cài đặt bằng cách nhấn JawsKey+ 6(trên hàng số phía trên các chữ cái) trong trình soạn thảo văn bản yêu thích của bạn. Nếu JAWS nhắc tạo tệp cấu hình mới, hãy đồng ý.
  2. Trong trường tìm kiếm, nhập "thụt lề"
  3. Sẽ chỉ có một kết quả: "Nói ký tự thụt lề". Bật cái này lên.
  4. Thưởng thức!

Điều duy nhất gây khó chịu cho chúng tôi là chúng tôi không thể thưởng thức các ví dụ mã trên các trang web (vì nói thụt lề trong trình duyệt không quá thoải mái - nó tạo ra lời nói thừa).

Chúc bạn viết mã vui vẻ từ một người mới bắt đầu Python khác).


3

Tôi sử dụng eclipse với các phần mở rộng pydev vì đó là một IDE mà tôi có nhiều kinh nghiệm. Tôi cũng đánh giá cao tính năng thụt lề thông minh mà nó cung cấp để mã hóa câu lệnh if, vòng lặp, v.v. Tôi đã định cấu hình tập lệnh pindent.py làm công cụ bên ngoài mà tôi có thể chạy trên mô-đun python hiện tập trung, giúp cuộc sống của tôi dễ dàng hơn, vì vậy tôi có thể biết đóng cửa mà không cần phải liên tục kiểm tra thụt lề.


1

Có nhiều câu trả lời giải thích cách làm điều này. Nhưng tôi khuyên bạn không nên đi theo con đường này. Mặc dù bạn có thể sử dụng một tập lệnh để thực hiện chuyển đổi, nhưng nó sẽ khiến bạn khó làm việc trong một dự án nhóm.

Đề xuất của tôi là định cấu hình trình đọc màn hình của bạn để thông báo các tab. Điều này không khó chịu như nó nghe, vì nó sẽ chỉ nói "thụt lề 5" chứ không phải "tab tab tab tab tab". Hơn nữa, thụt lề sẽ chỉ được đọc bất cứ khi nào nó thay đổi, vì vậy bạn có thể xem qua toàn bộ khối mã mà không cần nghe mức độ thụt lề. Bằng cách này, nghe thấy tiếng thụt vào không dài dòng hơn là nghe thấy tiếng niềng răng.

Vì tôi không biết bạn sử dụng hệ điều hành hoặc trình đọc màn hình nào nên rất tiếc, tôi không thể đưa ra các bước chính xác để đạt được điều này.


0

Edsger Dijkstra đã sử dụng if ~ fido ~ od trong "Ngôn ngữ lệnh được bảo vệ" của mình, chúng dường như bắt nguồn từ Algol68 . Cũng có một số ví dụ về khối được bảo vệ bằng python được sử dụng trong RosettaCode.org .

fi = od = yrt = end = lambda object: None;
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1) :# do
            if i > 5 :# then
                print i
            fi
        od # or end(i) #
    end(myfunction)
end(MyClass)

Mã python bị xáo trộn khoảng trắng có thể được tách ra rõ ràng và được định hướng lại nếu một mã sử dụng các khối được bảo vệ if / fi, do / od & try / yrt cùng với dấu chấm phẩy ";" để tách các câu lệnh. Tuyệt vời cho danh sách tạp chí rõ ràng hoặc cắt / dán từ các trang web.

Nó phải đủ dễ dàng để viết một chương trình python ngắn để chèn / xóa các khối bảo vệ và dấu chấm phẩy.

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.