私はPythonを学びたい完全に盲目のプログラマーです。残念ながら、コードブロックがさまざまなレベルのインデントで表されているという事実は、大きな障害です。中括弧またはその他のコードブロック区切り文字を使用してコードを記述し、その形式をPythonインタープリターが使用できる適切にインデントされた表現に変換できるツールがあるかどうか疑問に思いました。
私はPythonを学びたい完全に盲目のプログラマーです。残念ながら、コードブロックがさまざまなレベルのインデントで表されているという事実は、大きな障害です。中括弧またはその他のコードブロック区切り文字を使用してコードを記述し、その形式をPythonインタープリターが使用できる適切にインデントされた表現に変換できるツールがあるかどうか疑問に思いました。
回答:
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.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
最終的にどのソリューションを使用するのか知りたいのですが、さらにサポートが必要な場合は、この投稿にコメントしてください。サポートさせていただきます。
pindent
フラッシュレフトコードの逆を実行するツール(多くのブラインドプログラマーが好むインデントスキーム)が役立つ場合があります。より便利なのはfrom __future__ import braces
-ですが、イースターエッグとしてではありません。
pindent.py -c
、それはpindent.py -r
です。ライアンはすでに彼らの答えの中でそれを指摘しましたが、私はそれを編集して明確な例を追加し、見逃しにくくしました。(また、コマンドラインオプションを修正して、コメントを削除するだけではあり-r
ません-d
。)
多くのPython愛好家は、Pythonがこのように空白で区切られているという事実を気に入っているので、現時点では個人的には疑っています。
しかし、私は実際にそれをアクセシビリティの問題として考えたことはありません。たぶんそれはPythonへのバグレポートとして提案するものですか?
ただし、ここでは出力にスクリーンリーダーを使用していると思いますか?それで、タブはあなたには「見えない」ように見えるでしょうか?点字出力の方が読みやすいかもしれませんが、これがどれほど混乱するかは正確に理解できます。
実際、これは私にとって非常に興味深いものです。私はあなたのためにこれを行うアプリを書くことができるのに十分なことを知っていたらいいのにと思います。
あなたがすでに自分でそうしている、またはしたいのでない限り、それは間違いなくバグレポートに入れるものだと思います。
編集:また、John Millikinが指摘したように、PyBracesもあります。これは、実行可能なソリューションであり、コーディングスキルによっては、ハッキングされて必要なものになる可能性があります(その場合は、 、あなたはあなたのような他の人が使用できるようにそれをリリースします)
Windowsを使用している場合は、次のEdSharpを参照することを強くお勧めします。http://empowermentzone.com/EdSharp.htm 主要なWindowsスクリーンリーダーをすべてサポートし、コードのインデントレベルを話すように構成できます。または、代わりに中括弧構文との間で変換できるPyBraceと呼ばれる組み込みユーティリティがあり、プログラマーがテキストエディターで期待するようになった他のすべての機能をサポートします。PHPからJavaScript、HTML、Pythonに至るまで、何年にもわたって使用してきましたが、とても気に入っています。
問題はありがたいですが、解決する必要のある問題ではなく、実装を指定していると思います。中かっこに変換する代わりに、スクリーンリーダーがインデントレベルを通知する方法に取り組んでみませんか?
たとえば、Pythonのインデントレベルを表すためにvim構文の色付けに取り組んだ人もいます。おそらく、構文の色を変更すると、スクリーンリーダーが読み取るものが生成される可能性がありますか?
これらの「いいえ、できません」タイプの回答はすべて、本当に迷惑です。もちろんできます。
それはハックですが、あなたはそれを行うことができます。
http://timhatch.com/projects/pybraces/
カスタムエンコーディングを使用して、中括弧をインデントされたブロックに変換してから、インタプリタに渡します。
余談ですが、Pythonを初めて使用する人として、中括弧/一般的なブロック区切り文字を許可しない理由を受け入れません...それはPython開発者の好みです。コードの自動処理を行っている場合や、空白が重要であることを理解していないエディターで作業している場合は、少なくとも中括弧が誤って食べられることはありません。コードを自動的に生成する場合は、インデントレベルを追跡する必要がないので便利です。Pythonを使用してPerl風のワンライナーを実行したい場合は、自動的に機能しなくなります。他に何もないとしても、安全策として。1000行のPythonプログラムですべてのタブが食べられた場合はどうなりますか?行ごとに移動して、インデントがどこにあるべきかを理解しますか?
それについて尋ねると、「__将来の__中括弧をインポートする」、「IDEを正しく構成する」、「とにかく良いので、それに慣れてください」などの冗談のような応答が必ず得られます...
私は彼らの要点を理解していますが、ねえ、私が望むなら、私はすべての行の後にセミコロンを置くことができます。ですから、なぜ誰もが中括弧のことについてそれほど固執しているのか理解できません。適切にインデントするように強制するために言語が必要な場合は、そもそもそれを正しく行っていません。
ちょうど私の2c-とにかく中括弧を使用するつもりです。
アクセス可能なPythonIDEを検索し、これを見つけて答えることにしました。JAWSを使用するWindowsの場合:
私たちにとってイライラする唯一のことは、Webサイトでコード例を楽しむことができないことです(ブラウザーでのインデントの話し方はあまり快適ではないため、余分な音声が生成されます)。
別のPython初心者からのハッピーコーディング)。
これを行う方法を説明するさまざまな答えがあります。しかし、私はこのルートをとらないことをお勧めします。スクリプトを使用して変換を行うことはできますが、チームプロジェクトでの作業が難しくなります。
タブをアナウンスするようにスクリーンリーダーを構成することをお勧めします。「タブタブタブタブタブ」ではなく「インデント5」としか表示されないため、これは思ったほど煩わしいことではありません。さらに、インデントは変更されたときにのみ読み取られるため、インデントレベルを聞くことなくコードのブロック全体を調べることができます。このように、インデントを聞くことは、中括弧を聞くことよりも冗長ではありません。
使用しているオペレーティングシステムまたはスクリーンリーダーがわからないため、残念ながら、これを実現するための正確な手順を説明することはできません。
Edsgerダイクストラは使用〜もしFiを利用して〜ODを行う彼の「ガード付きコマンド言語」で、これらが由来すると思われるAlgol68。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)
保護されたブロックif / fi、do / od、try / yrtをセミコロン ";"と一緒に使用すると、空白がマングルされたPythonコードを明確にマングル解除して再インデントできます。ステートメントを分離します。明確な雑誌のリストやWebページからの切り取り/貼り付けに最適です。
ガードブロックとセミコロンを挿入/削除する短いPythonプログラムを作成するのは簡単なはずです。