フロヌチャヌトを䜿甚した自動Pythonコヌド芖芚化

次の図に瀺すような開発者ツヌルの実装を可胜にする技術に぀いおです。

画像

コヌドの代替衚珟を䜿甚した環境の䞀般的なビュヌ

ここでは、開発環境りィンドりは2぀の郚分に分かれおいたす。 巊偎には䜿い慣れたテキスト゚ディタがあり、右偎には、アルゎリズムの埓来のフロヌチャヌトに可胜な限り近い自動生成された図がありたす。 テキストが入力されるず、チャヌトの生成ず再描画が実行されたす。 開発環境は、開発者のアクションの䞀時停止を決定し、コヌドが正しいたたであればチャヌトを曎新したす。 その結果、プログラムテキストだけでなく、そのグラフィック衚珟でも機胜するこずが可胜になりたす。

野生のフロヌチャヌト


ブロック図は必芁ですか

゜フトりェア開発の私の経隓では、フロヌチャヌトが䜿甚され、その䜿甚方法はタスクに䟝存するこずが瀺されおいたす。 開発者には2぀の兞型的なシナリオがありたす。


私は䞡方のケヌスでフロヌチャヌトを䜿甚したすが、わずかに異なりたす。

新しい゜フトりェアの堎合、私は通垞トップダりンのアプロヌチを䜿甚したす。 最初に、アヌキテクチャは抜象ブロックず文字の圢で描かれ、次に個々のサブシステムがより詳现に䜜成され、遞択されたプログラミング蚀語のレベルに到達したす。 もちろん、絶察にすべおを詳现に描くのではなく、難しい郚分や特に興味のある郚分だけを描いおいたす。 MS Visioのような垂堎で入手可胜なツヌルは、図を描くのに圹立ちたすが、抜象床が高いだけです。 理想的なツヌルは、もしあれば、プログラミング蚀語のレベルで、できれば2぀の方向で圹立ちたす。コヌドによるダむアグラムの生成ずその逆、ダむアグラムによるコヌドの生成です。

既存のプロゞェクトをサポヌトする堎合、兞型的な-悲しみを匕き起こす-状況は、ドキュメントが欠萜しおいる堎合です。぀たり、䜜業を理解するには、たずリバヌス゚ンゞニアリングを行う必芁がありたす。 ここでは、ボトムアップのアプロヌチがよく機胜したす。 コヌドを読む過皋で、ある時点で、オペレヌタヌのグルヌプが䜕をするのかが理解できたす。぀たり、物理的に玙の䞊に、たたは投機的に-適切なテキストを含むブロックを描くこずができたす。 したがっお、挔算子のグルヌプの代わりに1぀の芁玠が衚瀺されたす。 最埌に、コヌドに察応する図が衚瀺されたす。 このシナリオをサポヌトするツヌルが欲しいのですが、ただ芋぀かりたせんでした。

完党を期すために、゜フトりェアの工業生産でダむアグラムを広く䜿甚する倧芏暡プロゞェクトに泚意を払うこずは理にかなっおいたす。 䜕かありたすか この質問に察する答えはむ゚スです。 私が知っおいるこの皮の最倧のプロゞェクトは、おそらく再利甚可胜な宇宙船ブランの゜フトりェアです。 アメリカの再利甚可胜な船ずは異なり、゜ビ゚トの船は有人ではありたせんでした。぀たり、 DRAGON蚀語を䜿甚しお開発された゜フトりェアに制埡の党負荷がかかったこずを意味したす。 DRAGONはデザむンのすべおの段階でグラフィック図のみを䜿甚し、開発者は埓来のテキストをたったく䜿甚したせんでした。 このプロゞェクトは、軌道ぞの進入ず船の垰還に成功したこずにより、゜フトりェアの高い信頌性を蚌明したした。 䜜業の結果に関するレポヌトでは、開発速床が速く、゚ラヌが少ないのは、ダむアグラムが広く䜿甚されおいるためであるこずに泚意しおください。 そしお今、ドラゎンは宇宙産業で゜フトりェアを䜜成するために䜿甚されおいたす。 残念なこずに、䞀郚の技術䞊の制限により、人気のあるプログラミング蚀語で䜜成する開発者の日垞業務でDRAGONのすべおの成果を䜿甚するこずが䞍可胜になりたす。 ただし、䞀般的な結論を出すこずができたす。アルゎリズムのブロック図のような図は有甚であり、かなりの利点がありたす。

画像

DRAGON蚀語の図の䟋サむトdrakon.suから

ツヌルキット


蚘事のトピックの文脈における開発プロセスの私の理解は、テキストず同様にコヌドを扱う方が䟿利な堎合ず、グラフィカル衚珟を分析する方が䟿利な堎合があるずいうこずです。 したがっお、理想的なツヌルは、1぀だけを優先するこずなく、2぀のビュヌで機胜するはずです。 このツヌルは、2぀のビュヌ間のスムヌズな統合も提䟛する必芁がありたす。最も単玔な䟋は、特定のコヌド行ず察応するグラフィック芁玠ずの関係です。

悲しいかな、説明したものに䌌た完成したツヌルはただ芋぀かっおいたせん。 DiaやMS Visioなどの゚ンゞニアリンググラフィックス甚の優れたパッケヌゞがあり、それらは蚭蚈された分野で非垞に優れおいたす。 いく぀かの段階で圹立ちたすが、頻繁な倉曎が必芁な堎合は䜿甚が非垞に困難です。 UMLツヌルなど、蚭蚈段階を察象ずしたパッケヌゞがありたすが、䜎レベルで䜿甚するには䞍䟿です。 さたざたなサブゞェクト領域甚のさたざたなコヌドゞェネレヌタヌがありたすが、生成されたコヌドは、読み取りを目的ずする堎合、簡単に読み取り可胜ずは蚀えたせん。 特定のサブゞェクト領域のみに焊点を圓おたグラフィカルツヌルがありたすが、汎甚プロゞェクトで䜿甚するこずはほずんど䞍可胜であり、そのようなツヌルではコヌドがたったく利甚できないこずがよくありたす。

そのようなツヌルがない堎合、それを䜜成できるテクノロゞヌの開発を開始する䟡倀があるでしょうか 技術ずそれを実装する実隓環境に぀いおさらに議論したす。 この環境を䜿甚するず、既存のプロゞェクトをテキストずしお、たたプロゞェクト間の自動同期を備えたグラフィックずしお芋るこずができたす。 実装はPython蚀語甚で、䞻にPythonで行われたす。

グラフィックプリミティブ


議論の良い出発点は、任意のPythonコヌドを衚すために必芁なグラフィカルプリミティブのセットです。 テキストからグラフィックスぞの移行から始めたしょう。入力にPythonコヌドがあり、出力に適切に盞互接続されたグラフィックプリミティブのセットを䜿甚しおダむアグラムを描画する必芁がありたす。 ここで察凊する必芁がある問題は次のずおりです。 入力ストリヌムで認識が必芁な蚀語芁玠は䜕ですか 認識された芁玠はどのようにチャヌトに描かれるべきですか

必芁なすべおのプリミティブを順番に説明したす。

コヌドブロック


明らかに、すべおのオペレヌタヌが制埡フロヌに盎接圱響するわけではありたせん。 このような挔算子は、コヌドのブロックずしお描画できたす。

なぜ個々のオペレヌタヌではなくブロックするのですか ほずんどの堎合、開発者はいく぀かのステヌトメントで構成される関連するコヌドを倧きなフラグメントにグルヌプ化する傟向がありたす。 明らかに、このようなグルヌプ化の目的は、埌続の読み取り䞭にコヌドの理解を容易にするこずです。 グルヌプ化の手段は空行です。 このようなグルヌプ化の事実は、ダむアグラムに衚瀺される必芁がありたす。

プリミティブに関しおは、単玔な長方圢が劥圓ず思われたす。 以䞋の䟋は、1぀のコヌドブロックず2぀のブロックを次々に瀺しおいたすが、挔算子間の空行のコヌドは異なりたす以䞋すべおの䟋で、最初にシリヌズ2のPythonコヌド、次に提案されたグラフィック衚珟。

c = MyClass( 154 ) c.member = f( 17 ) c.doSomething() print c 

画像
1ブロックのコヌド

 c = MyClass( 154 ) c.member = f( 17 ) c.doSomething() print c 

画像
コヌドの2぀のブロックを1぀ず぀

コメント


綿密な調査の結果、開発者がどのようにコメントを配眮したかに応じお、少なくずも3皮類のコメントを区別できるこずがわかりたした。 コヌドのブロックに察しお行われたのず同様の空癜行も、セマンティックフラグメントを圢成するため、考慮する必芁がありたす。 したがっお、匷調衚瀺されおいるコメントの皮類は次のずおりです。


独立したコメントは、1぀以䞊の隣接する行を占有し、少なくずも1぀の空行によっお残りから分離されたす。 独立したコメントの行には、コメントのみが含たれたす。

䞻芁なコメントは、1぀の䟋倖を陀き、独立したコメントに䌌おいたす。 リヌドコメントの最埌の行に続く行には、Python挔算子が含たれおいたす。 この堎合、開発者はコメントず次のブロックの間に空の行を挿入したせんでした。これは、おそらくこれが意図的に行われたこずを意味したす。コメントは次のブロックを察象ずしおいたす。

サむドコメントは、オペレヌタヌの右偎にありたす。 ここにはいく぀かの重芁な詳现がありたす。 倚くの堎合、コヌドのブロックは数行かかりたすが、開発者はそれらの䞀郚のみにサむドコメントを付けるこずができたす。 グラフィックを遞択するずきは、この状況を考慮する必芁がありたす。 別の詳现は、コヌドブロックの最埌の行に関するものです。開発者は、コメントを1行以䞊必芁ずする堎合がありたす。 そのような堎合もスケゞュヌルで考慮する必芁がありたす。

理論的には、もう1぀のタむプを区別できたす-最終コメント。 コヌドブロックの最終行ず最終コメントの最初の行の間に空行がないずいう違いはありたすが、先頭のコメントず䌌おいたす。 ただし、このような堎合は、䞀般的な慣行よりもたれです。 開発者は、テキストでは䜎く、高くはないものに぀いおコメントする可胜性が高くなりたす。 したがっお、最終コメントを別の゚ンティティずしお分離しないこずが決定されたした。

認識可胜なタむプのコメントに適切なグラフィックを遞択できるようになりたした。

独立したコメント


 a = 154 # Line 1 # Line 2 b = a 

画像
独立したコメント

この䟋では、独立したコメントは2行で構成されおいたす。 明らかに、コメントは2぀のコヌドブロックの間にあり、ダむアグラム䞊のこの䜍眮はブロックを結ぶ線に察応しおいたす。 この堎合に適したグラフィックは、ノヌトに䌌たコメントの長方圢で、ブロック間の線に぀ながる氎平コネクタがあるようです。

䞻芁なコメント


 # Line 1 # Line 2 a = 154 b = a 

画像
䞀流のコメント

このリヌドコメントはブロック甚であるため、ブロックの䞊にコメントの四角圢を描画し、必芁なブロックに぀ながるコネクタを远加できたす。

サむドコメント


 a = 154 b = a # No comment for the first line c = b + 1 # Comment for c # A tail -----^ 

画像
尟付きのサむドコメント

サむドコメンタリヌの堎合、いく぀かの点に泚意が必芁です。 たず、コヌド行ずコメントの間には芖芚的な察応がありたす。 䞊蚘の䟋では、最初の行にコメントはありたせん。そのような状況は、スケゞュヌルで考慮する必芁がありたす。 蚀い換えるず、コメントの長方圢の行は、テキスト内での敎列ずたったく同じように垂盎方向に敎列する必芁がありたす。 第二に、コヌドの最埌の行のコメントが耇数行になる堎合がありたす。 このような「尟」の兆候は次のように解釈されたす。


茞入品


むンポヌトは䟝存関係をもたらしたす。 たた、耇雑なプロゞェクトの䟝存関係を管理するこずは、しばしば困難な䜜業です。 したがっお、むンポヌト甚のグラフィックスは、チャヌトをすばやく確認する堎合でも泚意を匕く必芁がありたす。 これに基づいお、次の䟋に瀺すように、巊偎にアむコンが衚瀺された長方圢が遞択されたす。

 import sys # Leading comment for import from os.path import sep, \ isdir # Side comment from x import ( y, # side for y name ) # side for name 

画像
むンポヌトの䟋

この䟋では、2番目ず3番目のむンポヌトが耇数の行を占めおおり、その䞀郚にはサむドコメントが付いおいたす。

Ifステヌトメント


条件ブロックがチャヌト䞊でどのように衚瀺されるかに぀いお説明したしょう。 アルゎリズムの埓来のフロヌチャヌトは菱圢を提䟛したす。 菱圢は、それに蚘茉されおいる条件が短い堎合に最適です。 ただし、実際には、条件は長い堎合が倚く、時には耇数の行を䜿甚するため、条件党䜓を適切なサむズの菱圢に収めるこずが難しくなりたす。 ひし圢が倧きくなりすぎお貎重な瞊方向のスペヌスを倧量に占有するか、フォントを小さくしすぎるか、゜ヌステキストの略語に頌る必芁がありたす。 提案された劥協案の解決策は次のずおりです。巊偎ず右偎は菱圢で、䞊䞋はスペヌスを節玄するために氎平になりたす。 ぀たり、グラフィックスは郚分的に埓来の菱圢に䌌おいたす。 このようなグラフィックプリミティブは、条件の耇雑さに応じお簡単にスケヌリングできたす。

次のディスカッションアむテムは、yesおよびnoブランチを描画する方法です。 可胜なオプションの1぀は、条件ブロックの巊右に分岐を描くこずです。 残念ながら、このアプロヌチは、完党なダむアグラムを読むのが難しく、矎しく芋えない状況に぀ながる可胜性がありたす。 問題は、ブランチが任意の耇雑さになり、ブランチの幅が広くなり、条件ブロックが氎平方向にシフトするこずです。 その結果、衚瀺には垂盎スクロヌルず氎平スクロヌルの䞡方が必芁になりたすが、可胜であれば回避する必芁がありたす。

もう1぀の考慮事項は、時間の経過ずずもにコヌドを読みやすく、理解しやすいようにコヌドを蚭蚈するこずです。 プログラムのすべおの䞻芁なアクションが1぀の垂盎に配眮され、避けられない゚ラヌ凊理、たれなケヌスや特別なケヌスなどを確実に行えるようになれば幞いです。 少し暪にありたす。 その埌、元の䜜者がこれを凊理すれば、コヌドの目的をより早く理解できるようになりたす。 このスタむルの開発をサポヌトするために、この方法でチャヌトにブランチを配眮するこずを提案したす。ブランチの1぀は垂盎を圢成するための条件ブロックのすぐ䞋にあり、もう1぀はブロックの右偎にありたす。

 if 154 > 153: print "Well, yes" else: pass 

画像
ifステヌトメントの簡単な䟋

もちろん、著者はコメント付きのifステヌトメントに関連するコヌドのさたざたな郚分を提䟛できたす。 より耇雑なコヌド䟋ず提案されおいるグラフィックスを怜蚎しおください。

 # Leading for 'if' if ( 154 > 153 and # Side 1 1 > 0 ): # Side 2 print "Well, yes" # Leading for 'else' else: pass 

画像
コメント付きのifステヌトメント

この䟋では、条件に関するサむドコメントがありたす。 コヌドブロックず同様に、条件のサむドコメントは䞀郚の行に察しおのみ指定できるため、コメントの四角圢は条件の右偎に配眮し、それに応じお垂盎方向に配眮する必芁がありたす。 残念ながら、コメントコネクタず条件分岐の亀差を完党に回避するこずはできたせんでしたが、問題を緩和する状況もありたす条件の暪方向のコメントは実際にはめったに衚瀺されず、プログラマはしばしば先頭のコメントを䜿甚したす。

最埌の興味深い点は、他の人のリヌドコメントに぀いおです。 チャヌトには他に遞択されたプリミティブはありたせん;実行ブランチの線はそれに察応したす。 したがっお、チャヌト䞊では、このようなコメントめったに䜿甚されないは、独立したコメントのように芋え始めたす。 これに぀いお特にひどいものは䜕もありたせん-グラフィックスは今でも正確に䜕が起こっおいるかを䌝えたす。

機胜


Pythonファむルには、ネストされた関数の定矩だけでなく、関数の倚くの定矩を含めるこずができたす。 どのフロヌチャヌトも適切なものを提䟛しおいないため、新しいものを提案する必芁がありたす。

関数のグラフに぀いお考えるずきに頭に浮かぶアむデアの1぀は、スコヌプに関するものです。 スコヌプは、定矩された境界を持぀空間の圹割を果たしたす。 どの関数にも、明らかに、開始および終了する非垞に具䜓的なポむントがありたす。 これは、関数のグラフィックスが閉じた領域に䌌おいる可胜性があるこずを意味し、その内郚には関数本䜓のグラフィック衚珟が含たれおいたす。 少し䞀歩進んで、慣れおいないPythonコヌドを芋るず、コンテキストがすぐに明確にならないこずがよくあるこずを思い出すこずができたす。特定のコヌド行は、ネストされた関数内、クラス内、条件付き構造内に配眮できたす。 範囲の境界線を抂説したアむデアは、実行されるアクションのコンテキストをすばやく理解するこずを朜圚的に可胜にしたす。

最初に、提案されおいるグラフィックスの簡単な䟋を芋おみたしょう。

 def f( x ): print "Function f( x )" 

画像
機胜甚グラフィックス

関数のスコヌプは、角の䞞い長方圢で囲たれ、関数の匷調衚瀺された色で塗り぀ぶされたす。 四角圢のヘッダヌには、関数の名前ずその匕数が含たれおいたす。 ヘッダヌは、本䜓ず氎平線で区切られおいたす。 スコヌプの詳现を衚瀺するために、巊䞊隅にバッゞが远加されたした。これは、これが関数であるこずを明瀺的に瀺しおいたす。

ここで、関数の先頭にコメントがあり、ドキュメント行があり、パラメヌタヌが耇数行を占めおおり、コメントアりトされおいる、より耇雑な䟋を考えおみたしょう。

 # Leading comment def g( x, # x - first argument y ): # y - second argument """ Docstring """ print "Function g( x, y )" 

画像
コメントずドキュメントを含む機胜

リヌドコメントのグラフィックは明らかですが、匕数のサむドコメントは問題です。 サむドコメントの行は匕数のリストず垂盎に敎列する必芁があるずいう事実により、コメントヘッダヌを関数ヘッダヌに盎接配眮するこずが最も論理的であるこずが刀明したした。 提案された゜リュヌションが私にずっお完璧だずは蚀えたせんが、それは正しいPythonコヌドのすべおのケヌスをカバヌし、曖昧さを蚱したせん。

文曞化のために、スコヌプヘッダヌは、関数プロトタむプセクションのすぐ埌に続く別の氎平セクションで展開されたす。

Returnステヌトメント


埓来のフロヌチャヌトは、小さな機胜拡匵で掻甚できる優れた返华スケゞュヌルを提䟛したす。 簡単な䟋を挙げたす。

 def f( x ): return x * 154 

画像
シンプルなリタヌン

改善点は、巊矢印アむコンの远加です。 returnステヌトメントは制埡フロヌに匷い圱響を䞎えるため、アむコンはコヌドをすばやく衚瀺するずきに远加のアテンショングラブの目的を果たしたす。

もちろん、returnステヌトメントは耇数行にたたがる堎合があり、コメントが含たれる堎合がありたす。 以䞋はそのような堎合の䟋です。

 def f( x ): # Return leading return ( x * 154 + # Side 1 X / 154 ) # Side 2 

画像
コメント付きの耇数行リタヌン

クラス


スコヌプの抂念が関数に䜿甚された埌、クラスぞの適甚可胜性は論理的ではないようです。 クラスのグラフィックスは、異なる背景色ずバッゞを陀いお同じにするこずができたす。 以䞋の䟋は、コメントずdocstringを持぀クラスを瀺しおいたす。

 # Leading class C( ClassA, # Side ClassB ): "Docstring" def __init__( self ): ClassA.__init__( self ) self.__x = 0 

画像
クラスの䟋

デコレヌタ


関数およびクラスのコンテキストでは、デコレヌタヌをPythonに衚瀺できたす。 実際、デコレヌタはラッピング関数です。぀たり、芖芚化のために、同じスコヌプの考え方を䜿甚できたす。 簡単に識別できるように、独自の背景色を遞択しお、バッゞに@蚘号を挿入できたす。

 # Decorator leading # comment @decor( x, y ) # decorator # side comment def f(): print "Function f()" 

画像
コメント付きデコレヌタ

サむクル


Pythonは、forずwhileの2皮類のルヌプをサポヌトしおいたす。 どちらのタむプにも条件があり、breakステヌトメントずcontinueステヌトメントが内郚で発生する可胜性がありたす。 サむクルのスケゞュヌルの決定は容易ではなく、次の考慮事項に基づいおいたした。

埓来のフロヌチャヌトでは、ifステヌトメントに既に䜿甚されおいるグラフィックスを䜿甚したすが、ifグラフィックスに適した代替手段がないため、この゜リュヌションは有効なたたにしおおくのが最適です。

䞀方、スコヌプのようなルヌプには、非垞に明確な開始点ず終了点がありたす。 ルヌプ条件はスコヌプのタむトルに適しおいたす;スコヌプの内容はルヌプ本䜓の圹割を果たしたす。 もう1぀の考慮事項は、スコヌプを䜿甚する堎合、閉じた幟䜕孊的図圢があるため、同じ垂盎にプログラムのメむンアクションを衚瀺するずいうアむデアがより明確に衚珟されるこずです。 さらに、埓来のブロック図の堎合のコネクタは「トップダりン」の原則を満たしおいたせん-サむクルからの出口は最初の状態の右偎にありたす。 埓来のグラフィックスのもう1぀の問題は、Pythonサむクルに衚瀺される可胜性のあるelseパヌツの凊理方法が完党に䞍明確であるこずです。

最埌の考慮事項は、breakステヌトメントずcontinueステヌトメントに関するものです。 スコヌプを䜿甚する堎合、ブレヌクずコンティニュヌが続くポむントは完党に明癜になりたす-長方圢の䞋端ず䞊端。 埓来のブロック図の堎合、コネクタを描画する必芁がありたすが、耇雑な分岐コヌドの堎合は可胜な堎合描画するのが困難であるため、図が明癜で他のコネクタずの亀点はありたせん。

ルヌプのスコヌプのアむデアを䜿甚しお、先頭およびサむドコメントの問題もすでに解決されおいたす。

 for x in [ 1, 17, 42, 154 ]: print x 

画像
forルヌプ

より耇雑なケヌスでは、ルヌプにコメントずelseブロックが含たれる堎合がありたす。 以䞋の䟋を怜蚎しおください。

 x = 0 # While loop leading comment while x < 154: # while side # comment x += 1 # else leading comment else: # else side comment pass 

画像
elseブロックずコメントを含むwhileルヌプ

elseブロックは、ルヌプのスコヌプの右偎に別のスコヌプずしお描画されたす。 スコヌプは、それらの間の密接な関連を匷調するために、砎線で互いに接続されおいたす。 コメントはおなじみの方法で衚瀺されたす。 そしお、elseブロックの可芖性バッゞは、境界線からヘッダヌに移動したす。 そうでない堎合、タむトルは完党に空になり、それほど゚レガントに芋えたせん。

ステヌトメントを䞭断しお続行する


埓来のフロヌチャヌトは、䞭断しお続行するためのグラフィックを提䟛したせん。 コネクタはそれらに察応しおおり、解決が困難ないく぀かの問題に぀ながりたす。 たず、䞡方のオペレヌタヌが先頭ずサむドのコメントを持぀こずができ、コネクタヌの堎合、オペレヌタヌぞの所属が明らかであるようにコメントを衚瀺する方法が完党に䞍明確です。 第二に、コネクタは明確な配線の問題に぀ながりたす。 ルヌプの本䜓は耇雑になる可胜性があり、倚くのbreakおよびcontinueステヌトメントが含たれたす。 そのような堎合、最小限のねじれがあり、他のコネクタずの亀差がないような配線を実珟するこずは可胜な堎合困難です。

これらの問題に関連しお、䌑憩ず継続の新しいスケゞュヌルを導入するこずが決定されたした。 挔算子が実際に特定のポむントぞの遷移を衚すこずを匷調するために、ラベルに䌌おいお出力コネクタのないグラフィックが遞択されたした。 Pythonでプログラミングしおいる人は、おそらく移行がどこに぀ながるかを知っおいるので、出力コネクタは冗長に芋えたす。

 while True: if True: continue else: break 

画像
䌑憩ず継続の簡単な䟋

もちろん、オペレヌタはコメントを持っおいるかもしれたせん。 以䞋の䟋は、それらがどのようにレンダリングされるかを瀺し、察応する挔算子のメンバヌシップを䞀意に識別したす。

 while True: if True: # Leading 1 continue # Side 1 else: # Leading 2 break # Side 2 

画像
コメント付きのステヌトメントを䞭断しお続行する

詊しおみおください


これはおそらくPythonで最も耇雑な蚭蚈です。 tryブロックに加えお、倚くの䟋倖ブロックずオプションのelseブロックずfinallyブロックがありたす。 これらの各ブロックには独自のボディがあるため、各ブロックに可芖領域のグラフィックスを䜿甚するこずにしたした。

 try: a = x / y except ZeroDivisionError: print "?" else: print "a = ", a finally: print "finally" 

画像
䟋-䟋倖-else-最終的に

exceptブロックぱラヌを凊理するように蚭蚈されおいたす。぀たり、実行のメむンラむンの倖偎にありたす。 したがっお、それらはtryブロックの右偎にありたす。 tryブロックずexceptブロックの密接な関係をさらに匷調するために、それらの間に砎線が描かれおいたす。 陀倖ブロックが耇数ある堎合、ダむアグラムは右偎に「成長」し、陀倖ブロックが1぀ず぀配眮されたす。

elseブロックずfinallyブロックは、プログラム実行のメむンラむンに属する可胜性が高いため、図ではtryブロックの埌に続きたす。

明らかに、説明されおいる各芁玠には、他の蚀語挔算子ず同じ方法で描画できる先頭コメントずサむドコメントの䞡方を含めるこずができたす。

ステヌトメント付き


withステヌトメントは実行コンテキストを定矩するため、スコヌプの抂念が最適です。

 # Leading with open( "my-data.txt" ) as f: # Side data = f.read() print data 

画像
ステヌトメント付き

レむズ挔算子


䟋倖の生成が制埡フロヌに匷い圱響を及がすこずは間違いありたせん。 したがっお、レむズ挔算子のグラフィックは、䞀芋しただけでも泚意を匕き付けるようなものでなければなりたせん。 考慮する必芁があるもう1぀の考慮事項は、raiseステヌトメントにreturnステヌトメントず共通のプロパティがあるこずです。䞡方ずも珟圚のスコヌプを終了したす。 これに基づいお、巊の郚分にある倉曎されたアむコンを䜿甚しお、レむズに同じグラフィックを䜿甚するこずが決定されたした。レむズには目を匕く赀い矢印が衚瀺されたす。

い぀ものように、raiseステヌトメントは耇数の行にたたがるこずができ、先頭ずサむドのコメントを持぀こずができたす。

 # Leading raise Exception( "first line " # Side 1 "Second line" ) # Side 2 

画像
レむズ挔算子

アサヌト


assert文は条件付きで䟋倖をスロヌしたす。぀たり、raise文ず同じように制埡フロヌに圱響を䞎える可胜性がありたす。 これに基づいお、assertのグラフでは、アむコンをraiseのような赀い矢印のたたにしおおきたいが、䟋倖をスロヌする埓来性を匷調したかった。

 assert x == 97 # Leading assert type( x ) is IntType, \ "x is not an integer" # Side 

画像
2぀のアサヌトステヌトメントの䟋

䟋倖の条件は、巊偎の菱圢で瀺されおおり、既によく知られおいる赀い矢印が描かれおいたす。 もちろん、assertステヌトメントには先頭ずサむドのコメントを含めるこずができたす。 このケヌスは、䞊蚘の䟋の2番目の挔算子に察しお瀺されおいたす。

sys.exit


厳密に蚀えば、sys.exit呌び出しは蚀語の䞀郚ではありたせんが、制埡フロヌに盎接圱響したす。したがっお、sys.exitを認識しお適切に衚瀺するずいうアむデアは魅力的です。

この呌び出しの興味深い機胜は、構文的には、むンポヌトの䜜成方法によっお異なるように芋える堎合があるこずです。以䞋の䟋は、提案されたスケゞュヌルずさたざたなむンポヌトオプションを瀺しおいたす。

 if True: import sys sys.exit( 1 ) from sys import exit exit( 2 ) else: from sys import exit as f f( 3 ) from sys import * # Leading exit( 4 ) # side 

画像
䟋sys.exit

もちろん、evalを介しおsys.exitを呌び出すこずもできたす。そのようなオプションを認識するこずは困難ですが、それらはたれであり、埓来のオプションでさえもすでに十分にカバヌされおいたす。

sys.exitを呌び出すず、プログラムがスケゞュヌルより早く終了したす。぀たり、すべおの䞭間レベルを過ぎお戻るこずに䌌おいたす。したがっお、グラフィックはリタヌンオペレヌタヌから借甚され、アむコンは反射゚ッセンスに眮き換えられおいたす。

ファむル


グラフィックを必芁ずする最埌の芁玠は、別個のファむルです。pythonファむルには、チャヌトに衚瀺する必芁があるいく぀かの属性がありたす。


圓然、ファむルは他のすべおの芁玠が配眮されるスコヌプを圢成したす。以䞋の䟋は、ファむルのグラフ䞊の䞊蚘の芁玠の配眮を瀺しおいたす。

 #!/usr/bin/env python # encoding: utf-8 """ A file docstring may occupy a few lines """ print "Hello flowcharts" 

画像
Pythonファむル

抂念実蚌Codimension Python IDE


蚀語のどの芁玠を認識する必芁があるのか​​、そしおそれらをグラフィカルな衚珟でどのように衚瀺するのかがよくわかったので、ツヌルの䜜成を開始できたす。明らかに、ここでの重芁な質問は次のずおりです。テキストずグラフィックスはどのように盞互䜜甚するべきですか考えられる1぀の方法は、テキストを完党に砎棄し、グラフィックスのみを䜿甚するこずです。このアプロヌチはすぐに拒吊されたした。状況によっおは、テキストたたはグラフィックスが明確に勝぀こずができるず確信しおいたす。

したがっお、ツヌルは、いずれかを犠牲にするこずなく、プログラムの䞡方のタむプのプレれンテヌションをサポヌトする必芁がありたす。兞型的なPython IDEでは、テキスト゚ディタヌが䞭心的な圹割を果たしたす。このスペヌスをテキストずグラフィックスの間で均等に分けるこずは論理的なようです。

新しいプロゞェクトを開始する前に、既存のオヌプン゜ヌスIDEの分析を実行しお、コヌドのグラフィカルな衚珟をサポヌトするアドオンを開発したした。残念ながら、適切なものは芋぀かりたせんでした。そのため、Codimension Python IDEず呌ばれる新しいパむロットプロゞェクトが開始されたした。

画像
Codimension Python IDE

の䞀般的なビュヌCodimension IDEの開発はれロから始たりたせんでした。いく぀かのアむデアずコヌドの䞀郚は、別のオヌプン゜ヌスPython IDEであるeric 4から借甚されたした。

珟圚、Codimensionは、任意のPythonシリヌズ2コヌドのグラフィカルな衚珟の自動レンダリングを実装しおいたす。環境はコヌドの䞀時停止を決定し、テキストの右偎にダむアグラムを再描画したす。ある時点でコヌドが構文的に正しくなくなるず、チャヌトは曎新されず、テキストに関連するチャヌトステヌタスむンゞケヌタヌの色が赀に倉わりたす。

たた、マりスカヌ゜ルの䞋にあるスコヌプたでのパスの衚瀺も実装したす。図内の芁玠をダブルクリックするず、テキスト内の察応するフラグメントに移動したす。逆に、入力フォヌカスがテキスト郚分にあるずきに抌されるキヌの組み合わせは、察応するグラフィック芁玠の遷移ず匷調衚瀺に぀ながりたす。チャヌトを䞀般的な圢匏のSVG、PNG、およびPDFに゚クスポヌトする機胜がサポヌトされおいたす。もちろん、すべおのIDE機胜がここにリストされおいるわけではなく、グラフィカルプレれンテヌションの新機胜の蚈画はさらに倚くありたす。

第2郚では、グラフィックコンポヌネントに重点を眮いたCodimension IDEの実装に぀いお説明したす。ただ実珟されおいない新機胜、図をマヌクアップするためのマむクロ蚀語などに぀いお説明したす。

UPDパヌト2の公開

Source: https://habr.com/ru/post/J320184/


All Articles