Pythonコードのインデントを中括弧に変換する方法はありますか?


81

私はPythonを学びたい完全に盲目のプログラマーです。残念ながら、コードブロックがさまざまなレベルのインデントで表されているという事実は、大きな障害です。中括弧またはその他のコードブロック区切り文字を使用してコードを記述し、その形式をPythonインタープリターが使用できる適切にインデントされた表現に変換できるツールがあるかどうか疑問に思いました。


好奇心から、どのオペレーティングシステムを使用していますか?
ライアン

4
しかし、なぜスペースと改行が問題になるのですか。テキストリーダーに印刷できない文字を表示させることはできませんか?
e-satis

2
それは災害のレシピのようです。各行の前に「スペーススペーススペーススペーススペーススペーススペーススペースデフフー」を聴きたいという人はあまりいません。
javawizard 2015

@javawizard「deffooコロン、次の行、インデントの増加、...」または「インデントレベル0、def fooコロン、次の行のインデントレベル1、...」と記述することで機能する可能性があります
Smoothdeveloper 2016年

@smoothdeveloperもちろん、それが投稿者の質問です。
javawizard 2016年

回答:


56

Python自体で配布される問題の解決策があります。pindent.py、WindowsインストールのTools \ Scriptsディレクトリにあります(私のパスは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でコーディングできるようになります。

たとえば、runningを実行pindent.py -r myfile.pyすると、次のコードが、上記myfile.pypindent.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。)
IlmariKaronen19年

11

多くのPython愛好家は、Pythonがこのように空白で区切られているという事実を気に入っているので、現時点では個人的には疑っています。

しかし、私は実際にそれをアクセシビリティの問題として考えたことはありません。たぶんそれはPythonへのバグレポートとして提案するものですか?

ただし、ここでは出力にスクリーンリーダーを使用していると思いますか?それで、タブはあなたには「見えない」ように見えるでしょうか?点字出力の方が読みやすいかもしれませんが、これがどれほど混乱するかは正確に理解できます。

実際、これは私にとって非常に興味深いものです。私はあなたのためにこれを行うアプリを書くことができるのに十分なことを知っていたらいいのにと思います。

あなたがすでに自分でそうしている、またはしたいのでない限り、それは間違いなくバグレポートに入れるものだと思います。

編集:また、John Millikin指摘したように、PyBracesもあります。これは、実行可能なソリューションであり、コーディングスキルによっては、ハッキングされて必要なものになる可能性があります(その場合は、 、あなたはあなたのような他の人が使用できるようにそれをリリースします)

編集2:これをPythonバグトラッカーに報告しました


9

私は盲目ではありませんが、Emacspeakについて良いことを聞いたことがあります。1998年の8.0リリース以来Pythonモードを使用しています(リリース28.0までのようです!)。間違いなくチェックする価値があります。


6

タブとスペースを話すようにエディターを構成できるはずです。ほとんどのエディターで空白を表示できることはわかっているので、どこかにそれらを話すためのアクセシビリティオプションが必要です。

それができない場合、悪ふざけとして書かれたpybracesがありますが、実際には少しの作業で役立つかもしれません。


2
ただし、ある時点で、タブに依存するコードブロック内のどこにいるかを思い出すのが難しくなるという事実を考える必要があります。中かっこは特定の開始マーカーと終了マーカーを示しますが、タブを使用すると混乱する可能性があります(混乱し、目撃されます!)
Mez

6

Windowsを使用している場合は、次のEdSharpを参照することを強くお勧めします。http://empowermentzone.com/EdSharp.htm 主要なWindowsスクリーンリーダーをすべてサポートし、コードのインデントレベルを話すように構成できます。または、代わりに中括弧構文との間で変換できるPyBraceと呼ばれる組み込みユーティリティがあり、プログラマーがテキストエディターで期待するようになった他のすべての機能をサポートします。PHPからJavaScript、HTML、Pythonに至るまで、何年にもわたって使用してきましたが、とても気に入っています。


去年かそこらのメインエディターとして使っています。
Jared

4

問題はありがたいですが、解決する必要のある問題ではなく、実装を指定していると思います。中かっこに変換する代わりに、スクリーンリーダーがインデントレベルを通知する方法に取り組んでみませんか?

たとえば、Pythonのインデントレベルを表すためにvim構文の色付けに取り組んだもいます。おそらく、構文の色を変更すると、スクリーンリーダーが読み取るものが生成される可能性がありますか?


「レベル4のインデント」fooは新しいバーの「レベル3のインデント」と同じですそれは紛らわしいです、そしてあなたの心の中でそれを追跡しなければならないことは余分な負担です。
メズ

1
「レベルNインデント」、「イン」と「アウト」、または「インデント」と「ディデント」では不十分です。def foo(x):インデントリターンx * 2
dedent

4

これらの「いいえ、できません」タイプの回答はすべて、本当に迷惑です。もちろんできます。

それはハックですが、あなたはそれを行うことができます。

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

カスタムエンコーディングを使用して、中括弧をインデントされたブロックに変換してから、インタプリタに渡します。


余談ですが、Pythonを初めて使用する人として、中括弧/一般的なブロック区切り文字を許可しない理由を受け入れません...それはPython開発者の好みです。コードの自動処理を行っている場合や、空白が重要であることを理解していないエディターで作業している場合は、少なくとも中括弧が誤って食べられることはありません。コードを自動的に生成する場合は、インデントレベルを追跡する必要がないので便利です。Pythonを使用してPerl風のワンライナーを実行したい場合は、自動的に機能しなくなります。他に何もないとしても、安全策として。1000行のPythonプログラムですべてのタブが食べられた場合はどうなりますか?行ごとに移動して、インデントがどこにあるべきかを理解しますか?

それについて尋ねると、「__将来の__中括弧をインポートする」、「IDEを正しく構成する」、「とにかく良いので、それに慣れてください」などの冗談のような応答が必ず得られます...

私は彼らの要点を理解していますが、ねえ、私が望むなら、私はすべての行の後にセミコロンを置くことができます。ですから、なぜ誰もが中括弧のことについてそれほど固執しているのか理解できません。適切にインデントするように強制するために言語が必要な場合は、そもそもそれを正しく行っていません。

ちょうど私の2c-とにかく中括弧を使用するつもりです。


Pythonシェルを開いて、次のように入力する必要があります
。importthis

1
確かに、私の意見は経験を通して揺らいでいます。私は自分のプロジェクトの1つのニーズにPythonを強制的に適合させる方法を見つけようとしていましたが、説得の手段によってそうすることを拒否したことに不満を感じました。私は別の角度からやって来て、Pythonが美しく、非常に協力的なプラットフォームであることに気づきました。私が学んだ主な教訓は、安価なハックとコンピューターがうまく混ざらないということです。構文解析アルゴリズムについて詳細な調査を行う必要がありましたが、得た知識はそれだけの価値があります。私はまだインデント/デントを気にしませんが、私はそれらを尊重します。
la11111 2012

4

アクセス可能なPythonIDEを検索し、これを見つけて答えることにしました。JAWSを使用するWindowsの場合:

  1. お気に入りのテキストエディタでJawsKey+ 6(文字の上の数字の行)を押して、設定センターに移動します。JAWSが新しい構成ファイルの作成を要求する場合は、同意します。
  2. 検索フィールドに「インデント」と入力します
  3. 結果は「Sayindentcharacters」の1つだけになります。これをオンにします。
  4. 楽しい!

私たちにとってイライラする唯一のことは、Webサイトでコード例を楽しむことができないことです(ブラウザーでのインデントの話し方はあまり快適ではないため、余分な音声が生成されます)。

別のPython初心者からのハッピーコーディング)。


3

pydev拡張機能でEclipseを使用します。これは、私が多くの経験を積んだIDEだからです。また、ifステートメントやループなどのコーディングに提供されるスマートインデントにも感謝しています。pindent.pyスクリプトを、現在フォーカスされているpythonモジュールで実行できる外部ツールとして構成しました。これにより、作業が楽になり、何がわかるかがわかります。インデントを常にチェックする必要なしに閉じられました。


1

これを行う方法を説明するさまざまな答えがあります。しかし、私はこのルートをとらないことをお勧めします。スクリプトを使用して変換を行うことはできますが、チームプロジェクトでの作業が難しくなります。

タブをアナウンスするようにスクリーンリーダーを構成することをお勧めします。「タブタブタブタブタブ」ではなく「インデント5」としか表示されないため、これは思ったほど煩わしいことではありません。さらに、インデントは変更されたときにのみ読み取られるため、インデントレベルを聞くことなくコードのブロック全体を調べることができます。このように、インデントを聞くことは、中括弧を聞くことよりも冗長ではありません。

使用しているオペレーティングシステムまたはスクリーンリーダーがわからないため、残念ながら、これを実現するための正確な手順を説明することはできません。


0

Edsgerダイクストラは使用〜もしFiを利用して〜ODを行う彼の「ガード付きコマンド言語」で、これらが由来すると思われるAlgol68RosettaCode.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)

保護されたブロックif / fi、do / od、try / yrtをセミコロン ";"と一緒に使用すると、空白がマングルされたPythonコードを明確にマングル解除して再インデントできます。ステートメントを分離します。明確な雑誌のリストやWebページからの切り取り/貼り付けに最適です。

ガードブロックとセミコロンを挿入/削除する短いPythonプログラムを作成するのは簡単なはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.