Чи є спосіб перетворити відступ у коді Python у фігурні дужки?


82

Я абсолютно сліпий програміст, який хотів би вивчити Python. На жаль, той факт, що кодові блоки представлені з різними рівнями відступу, є основним каменем спотикання. Мені було цікаво, чи є в наявності будь-які інструменти, які дозволять мені писати код за допомогою фігурних дужок або якогось іншого роздільника блоків коду, а потім перетворювати цей формат у належний відступ, який інтерпретатор Python може використовувати?


З цікавості, яку операційну систему ви використовуєте?
Райан,

4
Але чому пробіли та розриви рядків є проблемою. Хіба не можна змусити читач тексту говорити недруковані символи?
e-satisfa

2
Це здається рецептом катастрофи - я не знаю багатьох людей, які хотіли б слухати "space space space space space space def foo" перед кожним рядком.
javawizard

@javawizard це може працювати, вказуючи "def foo двокрапка, наступний рядок, збільшення відступу, ..." або "рівень відступу 0, def foo двокрапка, відступ наступного рядка 1, ..."
smoothdeveloper

@smoothdeveloper Абсолютно, і це те, що задає питання плаката.
javawizard

Відповіді:


57

Існує рішення вашої проблеми, яке поширюється за допомогою самого python. pindent.py, він знаходиться в каталозі Tools \ Scripts в установці Windows (мій шлях до нього C: \ Python25 \ Tools \ Scripts), схоже, вам доведеться захопити його з svn.python.org, якщо ви працюєте на Linux або OSX.

Він додає коментарі, коли блоки закриваються, або може правильно відступити код, якщо в них додано коментарі. Ось приклад коду, виведеного pindent за допомогою команди:

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

Де 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!'

Ви також можете використовувати pindent.py -rдля вставлення правильного відступу на основі коментарів (докладніше прочитайте заголовок pindent.py), це повинно дозволити вам кодувати на python, не турбуючись про відступ.

Наприклад, запуск pindent.py -r myfile.pyперетворить наведений нижче код у myfile.pyтой самий правильно відбитий (і також коментований) код, як і у pindent.py -cприкладі вище:

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

Мені буде цікаво дізнатись, яке рішення ви використовуєте, якщо вам потрібна подальша допомога, прокоментуйте цю публікацію, і я спробую допомогти.


Протиголос. Це може допомогти з читанням коду, але не допомагає з написанням. Python та подібні до нього мови, які залежать виключно від інтервалу для представлення вкладеності, по суті порушуються, коли мова йде про доступність для сліпих. Може бути корисним інструмент, який виконує зворотне значення pindentдля коду зліва-ліворуч (краща схема відступу багатьох сліпих програмістів) . Більш корисним було б - але не як писанку. from __future__ import braces
Девід

1
@DavidHammen: Там поза інструмент , який виконує зворотне pindent.py -c; це pindent.py -r. Райан уже зазначив це у своїй відповіді, але я просто відредагував його, щоб додати явний приклад і ускладнити пропускання. (Крім того, я виправив параметр командного рядка, щоб зробити це: це -rне те, -dщо просто видаляє коментарі.)
Ілмарі Каронен

11

Я особисто сумніваюся, що зараз це існує, оскільки багато прихильників Python люблять той факт, що Python - це такий шлях, розділений пробілами.

Однак я ніколи не думав про це як про проблему доступності. Можливо, це щось висунути як звіт про помилку на Python?

Я вважаю, що ви використовуєте тут зчитувач з екрана, однак для виводу? Отже, вкладки здадуться вам «невидимими»? З висновком Брайля це може бути легше читати, але я точно розумію, наскільки це може бути заплутаним.

Насправді це мені дуже цікаво. Мені б хотілося, щоб я знав достатньо, щоб мати можливість написати програму, яка зробить це за вас.

Я думаю, що це, безумовно, те, для чого я вкладу звіт про помилки, якщо ви цього вже не зробили ви самі чи не хочете.

Edit: Крім того , як зазначено на Джона Міллікін Існує також PyBraces Який може бути життєздатним рішенням для вас, і може бути можливим бути зламана разом в залежності від ваших кодування навичок , щоб бути саме те , що вам потрібно (і я сподіваюся , що якщо це так , ви випускаєте його для інших, як ви)

Редагування 2: Я щойно повідомив про це у відстежувач помилок python



6

Ви повинні мати змогу налаштувати свій редактор на вимовляння вкладок та пробілів - я знаю, що в більшості редакторів можна відображати пробіли, тому десь має бути параметр доступності, щоб вимовляти їх.

Якщо цього не вдасться, є пібрацеї , що було написано як практичний жарт, але насправді може бути вам корисним, якщо трохи попрацювати.


2
Однак вам слід подумати про те, що в певний момент запам'ятати, де ви знаходитесь у кодовому блоці, який залежить від вкладок, буде важко. Фігурні дужки позначають певний маркер початку і кінця, тоді як за допомогою вкладок це може заплутати (я плутаюся з цим і бачу!)
Мез,

6

Якщо ви використовуєте Windows, я настійно рекомендую вам поглянути на EdSharp за адресою: http://empowermentzone.com/EdSharp.htm. Він підтримує всі провідні зчитувачі екрана Windows, його можна налаштувати так, щоб говорити рівні відступу коду, або у нього є вбудована утиліта під назвою PyBrace, яка може перетворювати в синтаксис фігурних дужок та з неї, якщо ви хочете це зробити, а також підтримує всі інші функції, які програмісти очікували в наших текстових редакторах. Я використовую його роками, для всього, від PHP до JavaScript, до HTML до Python, і мені це дуже подобається.


Я використовую його як головний редактор останній рік чи близько того.
Джаред,

4

Я ціную вашу проблему, але, думаю, ви вказуєте реалізацію замість проблеми, яку потрібно вирішити. Замість того, щоб перетворюватися на фігурні дужки, як щодо роботи над способом, щоб ваш читач з екрана повідомляв вам рівень відступу?

Наприклад, деякі люди працювали над розфарбуванням синтаксису vim для представлення рівнів відступу python. Можливо, змінене забарвлення синтаксису може створити щось, що читатиме ваш екран зчитування?


"відступ 4 рівня" foo дорівнює новому рядку "відступ 3 рівня" Це заплутано, і необхідність відстежувати це в думках є додатковим тягарем.
Мез

1
Не повинно бути достатньо "відступу рівня N", "в" проти "виходу" чи "відступу" проти "виділення". def foo (x): відступ повернення x * 2 dedent
kaleissin

4

Усі ці типи відповідей "ні, ти не можеш" насправді дратують. Звичайно, ви можете.

Це хак, але ви можете це зробити.

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

використовує користувальницьке кодування для перетворення фігурних дужок у блоки з відступами перед передачею їх інтерпретатору.


Як осторонь, і як хтось новий для python - я не сприймаю міркування, навіть не дозволяючи фігурні дужки / загальні роздільники блоків ... крім того, що перевагу розробників python. Фігурні дужки принаймні не з'їдаються випадково, якщо ви виконуєте автоматичну обробку коду або працюєте в редакторі, який не розуміє, що пробіли важливі. Якщо ви генеруєте код автоматично, зручно не відстежувати рівні відступу. Якщо ви хочете використовувати python для створення однокласника perl-esque, вас автоматично скалічують. Якщо нічого іншого, просто як запобіжник. Що робити, якщо ваша програма на 1000 рядків python з’їсть усі свої вкладки? Ви збираєтеся проходити рядок за рядком і з’ясовувати, де має бути відступ?

Якщо запитати про це, незмінно з’явиться відповідь на зразок "просто зроби" з __ майбутнього __ імпорту фігурних дужок "", "правильно налаштуй IDE", "все одно краще, тому звикай до цього ..."

Я бачу їх сенс, але ей, якби я хотів, я міг би ставити крапку з комою після кожного окремого рядка. Тому я не розумію, чому всі так непохитно ставляться до брекетів. Якщо вам потрібна ваша мова, щоб змусити вас правильно робити відступ, ви спочатку робите це не правильно.

Тільки моя 2c - я все одно буду використовувати брекети.


вам потрібно відкрити оболонку python і ввести: import this
ThatAintWorking

1
Дійсно, моя думка коливається через досвід. Я намагався знайти спосіб змусити python відповідати потребам одного з моїх проектів, і з розчаруванням виявив, що він відмовляється це робити будь-якими способами переконання. Я підійшов до цього з іншого боку і виявив, що python - це прекрасна платформа для співпраці. Основний урок, який я засвоїв, полягає в тому, що дешеві хакі та комп’ютери погано поєднуються. Мені довелося глибоко вивчити алгоритми синтаксичного аналізу, але знання, які я отримав, того варті. Мені все одно байдуже на відступ / відступ, але я їх поважаю.
la11111

4

Шукаючи доступний IDE Python, знайшов це і вирішив відповісти. Під Windows із JAWS:

  1. Перейдіть до Центру налаштувань, натиснувши JawsKey+ 6(на рядку із цифрами над буквами) у вашому улюбленому текстовому редакторі. Якщо JAWS запропонує створити новий файл конфігурації, погодьтеся.
  2. У полі пошуку введіть "відступ"
  3. Результат буде лише один: "Скажіть відступи символів". Увімкніть це.
  4. Насолоджуйтесь!

Єдине, що нас засмучує, це те, що ми не можемо насолоджуватися прикладами коду на веб-сайтах (оскільки відступ у браузерах не надто зручний - він генерує зайву мову).

Щасливого кодування від іншого новачка Python).


3

Я використовую eclipse із розширеннями pydev, оскільки це IDE, з яким я маю великий досвід. Я також ціную розумний відступ, який він пропонує для кодування операторів if, циклів тощо. Я налаштував скрипт pindent.py як зовнішній інструмент, який я можу запускати на поточно зосередженому модулі python, що полегшує моє життя, щоб я міг бачити, що таке закрито де без необхідності постійно перевіряти відступ.


1

Існують різні відповіді, що пояснюють, як це зробити. Але я б рекомендував не їхати цим маршрутом. Хоча ви могли б використовувати сценарій для перетворення, це ускладнило б роботу над командним проектом.

Моя рекомендація полягала б у налаштуванні вашого екранного зчитувача для оголошення вкладок. Це не так дратує, як здається, оскільки там буде сказано лише "відступ 5", а не "вкладка вкладки вкладка вкладка вкладка". Крім того, відступ читатиметься лише тоді, коли він змінюється, так що ви можете пройти весь блок коду, не чуючи рівня відступу. Таким чином, слухання вдавлення не є більш багатослівним, ніж слухання брекет-систем.

Оскільки я не знаю, яку операційну систему чи зчитувач з екрана ви використовуєте, я, на жаль, не можу дати точних кроків для досягнення цього.


0

Едсгер Дейкстрой використовується , якщо ~ ц і зробити ~ од в його «обережному Command Language», вони з'являються, відбуваються з Algol68 . Також було кілька прикладів блоків, захищених пітоном, що використовуються на 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)

Код python, пропущений пробілами, можна однозначно не виводити та переназначати, якщо використовується захищені блоки if / fi, do / od & try / yrt разом із крапкою з комою ";" відокремлювати твердження. Відмінно підходить для однозначних списків журналів або вирізання / вставки з веб-сторінок.

Написати коротку програму на python, щоб вставити / видалити захисні блоки та крапки з комою, повинно бути досить просто.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.