Есть ли способ преобразовать отступ в коде Python в фигурные скобки?

82

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

Джаред
источник
Из любопытства, какую операционную систему вы используете?
Райан
4
Но почему пробелы и разрыв строки проблема. Разве нельзя сделать так, чтобы программа чтения текста говорила о непечатаемых символах?
e-satis
2
Это похоже на рецепт катастрофы - я не знаю многих людей, которые хотели бы слушать «космос космос космос космос космос космос космоса 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

Мез
источник
9

Хотя я не слепой, я слышал много хорошего об Emacspeak . У них был режим Python с момента их выпуска 8.0 в 1998 году (похоже, они до выпуска 28.0!). Определенно стоит проверить.

техномалогический
источник
6

Вы должны иметь возможность настроить свой редактор так, чтобы он произносил табуляции и пробелы - я знаю, что это возможно в большинстве редакторов отображать пробелы, поэтому где-то должна быть опция доступности, чтобы озвучивать их.

В противном случае есть pybraces , который был написан как розыгрыш , но на самом деле может быть вам полезен после небольшой работы.

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

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

Fastfinge
источник
Я использую его в качестве основного редактора в течение последнего года или около того.
Джаред
4

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

Например, некоторые люди работали над раскраской синтаксиса vim для представления уровней отступов Python. Возможно, измененная раскраска синтаксиса может дать вам то, что прочитает ваш экранный ридер?

Энди
источник
«отступ 4-го уровня» foo равен новой полосе «отступ 3-го уровня» Это сбивает с толку, и необходимость отслеживать это в уме - дополнительное бремя.
Mez,
1
Не должно быть достаточно «отступа уровня N», «входа» против «выхода» или «отступа» против «отступа». def foo (x): indent return x * 2 dedent
kaleissin
4

Все эти типы ответов типа «нет, ты не можешь» действительно раздражают. Конечно вы можете.

Это взлом, но вы можете это сделать.

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

использует настраиваемую кодировку для преобразования фигурных скобок в блоки с отступом перед передачей их интерпретатору.


Как и в сторону, и как кто - то нового к питона - я не принимаю рассуждения позади даже не позволяя фигурные скобки / общие блочные разделители ... кроме того быть предпочтение питона дэвов. По крайней мере, фигурные скобки не будут съедены случайно, если вы выполняете автоматическую обработку своего кода или работаете в редакторе, который не понимает, что пробелы важны. Если вы генерируете код автоматически, удобно не отслеживать уровни отступов. Если вы хотите использовать python для создания однострочника в стиле Perl, вы автоматически испортитесь. По крайней мере, в качестве гарантии. Что, если ваша 1000-строчная программа на Python съедает все свои вкладки? Вы собираетесь построчно выяснять, где должен быть отступ?

Если спросить об этом, вы всегда получите насмешливый ответ вроде «просто сделай 'из __ future __ import braces'», «правильно настройте свою IDE», «в любом случае лучше, так что привыкай» ...

Я понимаю их точку зрения, но, эй, если бы я хотел, я мог бы поставить точку с запятой после каждой строки. Поэтому я не понимаю, почему все так категорично относятся к брекетам. Если вам нужен ваш язык, чтобы заставить вас делать отступы правильно, вы в первую очередь делаете это неправильно.

Только мой 2с - я все равно буду использовать подтяжки.

la11111
источник
вам нужно открыть оболочку python и ввести: import this
ThatAintWorking
1
На самом деле, на мое мнение повлиял опыт. Я пытался найти способ заставить python соответствовать потребностям одного из моих проектов и был разочарован, обнаружив, что он отказывался делать это любыми средствами убеждения. Я подошел к этому с другой точки зрения и обнаружил, что python - прекрасная платформа с высокой степенью взаимодействия, на которой можно работать. Главный урок, который я усвоил, заключается в том, что дешевые хаки и компьютеры плохо сочетаются друг с другом. Мне пришлось глубоко изучить алгоритмы синтаксического анализа, но полученные мной знания того стоят. Мне все еще не нравятся indent / dedent, но я их уважаю.
la11111
4

Поискав доступную Python IDE, нашел это и решил ответить. Под Windows с JAWS:

  1. Перейдите в Центр настроек, нажав JawsKey+ 6(в числовом ряду над буквами) в вашем любимом текстовом редакторе. Если JAWS предложит создать новый файл конфигурации, соглашайтесь.
  2. В поле поиска введите «отступ»
  3. Результат будет только один: «Произнесите символы отступа». Включи это.
  4. Наслаждайтесь!

Единственное, что нас расстраивает, это то, что мы не можем наслаждаться примерами кода на веб-сайтах (поскольку использование отступов в браузерах не слишком удобно - оно генерирует лишнюю речь).

Удачного кодирования от другого новичка в Python).

Андре Поликанин
источник
3

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

Джаред
источник
1

Есть разные ответы, объясняющие, как это сделать. Но я бы рекомендовал не идти по этому пути. Хотя вы можете использовать сценарий для преобразования, это затруднит работу над командным проектом.

Я бы порекомендовал настроить программу чтения с экрана так, чтобы она сообщала о вкладках. Это не так раздражает, как может показаться, поскольку в нем будет написано только «отступ 5», а не «вкладка вкладка вкладка вкладка». Кроме того, отступ будет считываться только при его изменении, поэтому вы можете пройти через весь блок кода, не слыша уровень отступа. Таким образом, прослушивание отступа не более многословно, чем прослушивание фигурных скобок.

Поскольку я не знаю, какую операционную систему или программу чтения с экрана вы используете, я, к сожалению, не могу дать точных шагов для достижения этой цели.

Сакиб
источник
0

Эдсгер Дейкстра использовал if ~ fi и do ~ od в своем «Защищенном командном языке», они, по-видимому, происходят из Алгола68 . Также в RosettaCode.org использовалось несколько примеров защищенных блоков Python .

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 для вставки / удаления защитных блоков и точек с запятой.

NevilleDNZ
источник