それほど匷力ではないプログラミング蚀語が必芁です





今日、倚くのシステムずプログラミング蚀語は「匷力」ず䜍眮付けられおいたす。 これは、これが悪いず蚀うこずではありたせん。 私たちのほが党員がこれを前向きな機胜だず考えおいたす。 しかし、この投皿では、倚くの堎合、 それほど匷力ではないプログラミング蚀語ずシステムが必芁になるずいう芳点を䌝えたいず思いたす。 しかし、続行する前に、明確にする぀もりです。オリゞナルの、私自身の考えはほずんどありたせん。 ダグラス・ホフスタッタヌの本、ゎッデル、゚ッシャヌ、バッハを読んだ埌に生たれた䞀連の思考の抂芁を説明したす。 たた、フィリップワドラヌの投皿ず Scala䌚議のビデオは、以䞋に瀺す資料に倧きな圱響を䞎えたした。 重芁な考えはこれです



衚珟力が高たるたびに、メッセヌゞを理解したいすべおの人に远加の負担がかかりたす。



そしお、Pythonコミュニティにより近く明確になる䟋でこの点を説明したいず思いたす。



定矩に関するいく぀かの蚀葉。 倚かれ少なかれ匷力なプログラミング蚀語ずはどういう意味ですか 投皿のフレヌムワヌク内では、これはおおよそ次のように説明できたす。コヌドを曞いたり、システムにデヌタを入力したりする人の芳点からは、「自由ず、奜きなこずをする胜力」。 これは正匏な定矩ではありたせんが、「衚珟力」の抂念ずほが盞関しおいたす。 より正確には、倚くの蚀語はチュヌリング完党性に関しお同じレベルの衚珟力を持っおいたす。 しかし、開発者は、より少ないコヌドで、たたはいく぀かの異なる方法で特定の結果を埗るこずができ、より倚くの自由が埗られるため、それらのいく぀かをより匷力なものずしお遞びたす。



しかし、この自由床はそれほど単玔ではありたせん。 任意の蚀語を䜿甚するずきに䞻匵する「力」の各ビットは、誰かがあなたが曞いたものを「消費する」ずきに提䟛しなければならないリタヌンに等しい。 以䞋は正匏にプログラミングに関連する䟋ですが、同時に魂の反応を芋぀けたす。



誰かが尋ねたす「それでも問題ですか」もちろん、あなたのシステムの結果を「消費する」こずができる範囲で。 ゜フトりェアコンシュヌマ、コンパむラ、および開発者向けのその他のツヌルは「コンシュヌマ」ずしお機胜するため、ほずんどの堎合、補品のパフォヌマンスず正確さだけでなく、人も気にしたす。



デヌタベヌスずスキヌマ



「衚珟力」スケヌルの䞋䜍レベルは、プログラミング蚀語ではなくデヌタに起因するものです。 ただし、デヌタず蚀語の䞡方が「誰かからのメッセヌゞを受信する」ず認識される必芁があるため、ここでも同じアプロヌチが適甚されたす。



䜕幎もの間、私はしばしば、あらゆる圢匏でテキストを入力するためのフィヌルドを䜜るように頌たれたした。 ゚ンドナヌザヌの芳点からするず、このようなフィヌルドは最高レベルの「パワヌ」を䜓珟しおいたす。䜕でも入力できるからです。 そしお、このロゞックの枠組みの䞭で、そのようなフィヌルドは「最も圹立぀」ものです。



しかし、フィヌルドにテキストを入力できるため、それは構造化にあたり圹立たないので、最も圹に立ちたせん。 そのようなフィヌルドでの怜玢でさえ、確実に機胜したせん-タむプミスの可胜性ず、いく぀かのこずを説明するさたざたな方法のためです。 デヌタベヌスでの䜜業時間が長くなればなるほど、可胜なすべおを厳密に芏制したいずいう欲求が匷くなりたす。 そしお、私がこれをなんずかするずき、埗られたデヌタからより倚くの利益を匕き出すこずができたす。 ぀たり、システムにデヌタを入力する゜ヌスの「パワヌ」぀たり自由を制限すればするほど、このデヌタを「消費」する機䌚が増えたす。



同じこずがデヌタベヌス技術にも蚀えたす。 非構造化スキヌマレスデヌタベヌスは、デヌタ入力に十分な機䌚ず柔軟性を提䟛し、その出力ではより圹に立ちたせん。 Key-Valueストレヌゞは「自由圢匏のテキスト」に䌌おいたすが、同じ欠点がありたす。情報を抜出したり、デヌタで䜕かをしたい堎合にはほずんど圹に立ちたせん。次に特定のキヌ。



HTML



䞀郚には、Webの成功は、䞻芁な技術であるHTMLずCSSの機胜の意図的な制限によるものでした。 はい、これらはマヌクアップ蚀語であり、プログラミング蚀語ではありたせんが、偶然ではありたせんでした。 それは意識的に遞ばれた抂念であり、その創蚭者の䞀人はティム・バヌナヌズ・リヌでした。 「1960幎代から1980幎代にかけお、コンピュヌタヌサむ゚ンスはたすたす匷力なプログラミング蚀語を䜜成するために倚くの努力をしたした。 しかし、今日では、それほど匷力でないツヌルを遞択する必芁がある理由がありたす。 それらの1぀は、蚀語が「匱い」ほど、保存されおいるデヌタを䜿甚しおより倚くのこずができるずいうこずです。 単玔な宣蚀フォヌムを䜜成するず、誰でもこのフォヌムをさたざたな方法で分析するプログラムを䜜成できたす。 䞀般的な意味で、セマンティックネットワヌクは、䜜成者が倢にも思わなかったこのようなデヌタ分析の機䌚を埗るために、倧量のデヌタを通垞の蚀語に倉換する詊みです。



たずえば、WebペヌゞでRDFを䜿甚しお倩気予報を衚瀺する堎合、ナヌザヌはこのデヌタを衚に抜出し、䜕らかの方法で凊理、平均化、グラフをプロットし、他の情報ず比范できたす。 これをJavaアプレットず比范しおください。情報は非垞に矎しく衚瀺できたすが、分析するこずはできたせん。 怜玢ボットは、ペヌゞに衚瀺される内容を理解したせん。 Javaアプレットが䜕をするかを知る唯䞀の方法は、画面の前に座っおいる人の前で実行するこずです。



W3Cコン゜ヌシアムは同じ立堎を取りたした 「グッドプラクティスWorld Wide Webで情報、リンク、たたはアプリケヌションを衚珟するのに適した最も匷力でない蚀語を䜿甚したす 。 」



これは、 Paul Grahamのアドバむスにほが完党に反しおいたす「暩力」の定矩は倚くの堎合、圢匏的ずは皋遠いものであるずいう点に泚意しおください。



MANIFEST.in圢匏のファむル



「実際の」プログラミング蚀語に移りたしょう。 䟋ずしお、distutilsおよびsetuptoolsツヌルで䜿甚されるMANIFEST.inファむル圢匏を遞択したした。 Pythonラむブラリ甚のパッケヌゞを䜜成したこずがある堎合は、おそらくこの圢匏に粟通しおいるでしょう。



実際、これはPythonのパッケヌゞに含めるファむルを蚘述する非垞に小さな蚀語です䜜業ディレクトリから呌び出されるMANIFEST.inファむルに関連。 䟋



include README.rst recursive-include foo *.py recursive-include tests * global-exclude *~ global-exclude *.pyc prune .DS_Store
      
      





ディレクティブには2぀のタむプがありたす。





疑問が生じたす。これらの指什はどのように解釈されたすか ぀たり、それらのセマンティクスは䜕ですか

「 䜜業ディレクトリたたはサブディレクトリからのファむルは、少なくずも1぀のincludeタむプのディレクティブに䞀臎し、excludeタむプのディレクティブに䞀臎しない堎合、パッケヌゞに含める必芁がありたす。」



この蚀語は宣蚀的であるようです。 残念ながら、そうではありたせん。 distutilsのドキュメントには、MANIFEST.inに぀いお蚘述されおいたす-ディレクティブは次のように理解する必芁がありたす。



  1. パッケヌゞに含たれるファむルの空のリストから始めたす。 より正確には、デフォルトのリストから始めたす。
  2. 順序に埓っお MANIFEST.inの指瀺に埓いたす。
  3. タむプがincludeの各ディレクティブに぀いお、関連するすべおのファむルを䜜業ディレクトリからパッケヌゞリストにコピヌしたす。
  4. 陀倖ディレクティブごずに、察応するすべおのファむルをパッケヌゞリストから削陀したす。


この䟋は、この蚀語の呜什的な性質を瀺しおいたす。MANIFEST.inの各行は、そのアクションが副䜜甚の存圚を瀺唆するチヌムです。 これにより、䞊蚘の疑䌌宣蚀バヌゞョンよりも蚀語が匷力になりたす。 䟋を考えおみたしょう



 recursive-include foo * recursive-exclude foo/bar * recursive-include foo *.png
      
      





これらのコマンドのリストの結果、pngファむルfoo / barの䞋がパッケヌゞに含たれおいたす。 たた、foo / barの䞊のすべおがパッケヌゞに含たれおいるわけではありたせん。 宣蚀型蚀語を䜿甚しお同じ結果を達成するこずは、たずえば次のようにより困難です。



 recursive-include foo * recursive-exclude foo/bar *.txt *.rst *.gif *.jpeg *.py ...
      
      





呜什型蚀語はより匷力なので、それを遞択する誘惑がありたす。 ただし、呜什型にはいく぀かの重芁な欠点がありたす。



  1. 最適化の難しさ 。 MANIFEST.inを解釈し、パッケヌゞに含めるファむルのリストを䜜成する堎合、有効な゜リュヌションは1぀だけです。最初に、ディレクトリずサブディレクトリ内のすべおのファむルの倉曎䞍可胜なリストを䜜成し、次にルヌルを適甚したす。 远加の芏則に埓っおファむルを出力リストにコピヌし、陀倖の芏則に埓っおファむルからファむルを削陀したす。 このアプロヌチは珟圚Pythonで実装されおいたす。



    ファむルが比范的少ない堎合、これは有効なオプションです。 たた、リストが数千のアむテムで構成されおいる堎合、そのほずんどをパッケヌゞから陀倖する必芁があるため、最終的なリストの䜜成には倚くの時間がかかりたす。



    この問題の解決策は明癜なようです。䞀郚のディレクティブによっお陀倖されるディレクトリには移動しないでください。 ただし、これは、陀倖ディレクティブがすべおの包含ディレクティブに続く堎合にのみ可胜です。



    この問題は理論的なものではありたせん。 䜜業ディレクトリ内のファむルの数が倚いため、たずえばtoxツヌルを䜿甚する堎合、setup.py sdistおよびその他のコマンドを実行するず10分に達するこずがありたす。 ぀たり、tox自䜓setup.pyを䜿甚の動䜜は非垞に遅くなりたす。 今、 私はこの問題を解決しようずしおいたすが、これを行うのは非垞に難しいず思いたす。



    䞀芋するず、最適化を行うこずは可胜ですすべおのディレクティブを远加した埌に排他的なディレクティブを実行するこずにより、ファむルシステムをそれほど集䞭的に䜿甚したせんが、これはすべおを著しく耇雑にし、パッチは受け入れられそうにありたせん。 コヌドブランチの数が増えるため、倚数の゚ラヌが発生する可胜性が高くなりたす。



    おそらく唯䞀受け入れられる解決策は、MANIFEST.inの䜿甚を完党に攟棄し、完党に空の堎合にのみ最適化するこずです。
  2. 「パワヌ」の裏偎MANIFEST.inファむルは理解しにくい。 たず第䞀に、蚀語の原則を習埗するこずはより困難です。 装食版の堎合、ドキュメントは実際よりもはるかに短くなりたす。



    さらに、特定のMANIFEST.inを分析するずきは、結果を衚瀺しようずしお粟神的にコマンドを実行する必芁がありたす。 郜合の良い順序で行を配眮する方がはるかに簡単です。



    これはすべお、パッケヌゞの䜜成時に゚ラヌに぀ながりたす。 たずえば、MANIFEST.inの先頭にあるglobal-exclude *〜ディレクティブは、名前が〜䞀郚の゚ディタヌの䞀時ファむルで終わるすべおのファむルがパッケヌゞから陀倖されるこずを意味したす。 実際、このディレクティブは䜕もしたせん。 そしお、以䞋のディレクティブのいずれかがパッケヌゞにいく぀かのファむルを含めようずするず、それらは誀っお含たれたす。 この゚ラヌの次の䟋を芋぀けたした意図したずおりに動䜜しないディレクティブを陀倖したす。

    • hgview ファむルの最初に配眮した堎合、機胜したせん;
    • django-mailer ファむルの先頭の壊れたグロヌバル陀倖ディレクティブ。
  3. 文字列の順序を倉曎するずパッケヌゞの構成に圱響するため、認識しやすくするためにMANIFEST.inで文字列をグルヌプ化するこずはできたせん。


ルヌティング



ルヌティングはDjangoのコアコンポヌネントの1぀です。 これは、URLを解析し、指定されたURLのハンドラヌに枡すコンポヌネントです。 同時に、おそらく、URLからいく぀かのコンポヌネントを抜出したす。



Djangoでは、これは正芏衚珟を䜿甚しお実装されたす。 子猫に関する情報を衚瀺するアプリケヌションがあり、子猫/ urls.pyファむルに次のコヌドが含たれおいるずしたす。



 from django.conf.urls import url from kittens import views urlpatterns = [ url(r'^kittens/$', views.list_kittens, name="kittens_list_kittens"), url(r'^kittens/(?P<id>\d+)/$', views.show_kitten, name="kittens_show_kitten"), ] ,  views.py  : def list_kittens(request): # ... def show_kitten(request, id=None): # ...
      
      







正芏衚珟には、ビュヌ関数に枡されるパラメヌタヌを取埗するために䜿甚される組み蟌みのキャプチャ関数がありたす。 cuteness.comでアプリケヌションを動䜜させたす。 次に、アドレスwww.cuteness.com/kittens/23がshow_kittenコヌドぞの呌び出しを開始したすリク゚スト、id = "23"。



URLを特定の機胜にルヌティングできるようになったため、Webアプリケヌションはほずんど垞にこれらの同じURLを生成するように匷制されたす。 子猫のリストがあるペヌゞに、個人ペヌゞぞのリンクを含める必芁があるずしたすshow_kitten。 そしお確かに、URLルヌティング構成を再利甚するこずでこれを行うこずができたす。



ただし、逆方向に䜿甚したす。 URLルヌティングを実行する堎合、次の手順を実行したす。



 URL path -> (handler function, arguments)
      
      





生成するずき、ハンドラヌ関数ず必芁な匕数を知っおいたす。 そしお、URLルヌティングを完了した埌 、ナヌザヌを目的のペヌゞに導くURLを䜜成する必芁がありたす。



 (handler function, arguments) -> URL path
      
      





これを行うには、ルヌティングメカニズムの動䜜を予枬できる必芁がありたす。 「今週末のむンプットはどうなるのか」ず尋ねたす。Djangoの歎史のごく初期には、ただそのような機胜はありたせんでした。 しかし、ほずんどの堎合、URLテンプレヌトの「方向を倉曎」できるこずがわかりたした。 静的およびキャプチャされた芁玠を芋぀けるために、正芏衚珟を解析できたす。



URLルヌトの定矩に䜿甚される蚀語-正芏衚珟-には特定の制限があるため、これが可胜であるこずに泚意しおください。 これにはもっず匷力な蚀語を䜿甚できたすが。 たずえば、次の機胜を䜿甚しおURLを定矩したす。





urls.pyは次のようになりたす。



 from django.conf.urls import url, NoMatch def match_kitten(path): KITTEN = 'kitten/' if path.startswith(KITTEN): return path[len(KITTEN):], {} raise NoMatch() def capture_id(path): part = path.split('/')[0] try: id = int(part) except ValueError: raise NoMatch() return path[len(part)+1:], {'id': id} urlpatterns = [ url([match_kitten], views.list_kittens, name='kittens_list_kittens'), url([match_kitten, capture_id], views.show_kitten, name="kittens_show_kitten"), ]
      
      





もちろん、match_kittenずcapture_idをより簡朔にするこずもできたす。



 from django.conf.urls import url, m, c urlpatterns = [ url([m('kitten/'), views.list_kittens, name='kittens_list_kittens'), url([m('kitten/'), c(int)], views.show_kitten, name="kittens_show_kitten"), ]
      
      





mずcが関数を返すこずを考えるず、この蚀語は正芏衚珟に基づいお、実際よりもURLをルヌティングするためにより匷力であるこずが刀明したした。 䞀臎を怜出しおキャプチャするためのむンタヌフェむスには、より倚くの機胜がありたす。たずえば、デヌタベヌスなどでIDを怜玢できたす。



しかし、この蜂蜜の暜にはタヌルも含たれおいたす。URLを逆にするこずはできたせん。 チュヌリング完党蚀語では、「そのような出力での入力デヌタはどうなりたすか」ず尋ねるこずはできたせん。理論的には、既知のパタヌンを怜玢するために関数の゜ヌスコヌドを衚瀺できたすが、これは完党に非珟実的です。



たた、機胜が制限されおいる正芏衚珟では、より倚くのオプションを䜿甚できたす。 䞀般に、単玔な匏は䞀皮なので、通垞ベヌスのURL構成は逆になりたせん。 ドットのみを独自の方法で元に戻すこずはできたせん。 たた、埓来のURLを通垞どおり生成する堎合は、独自の゜リュヌションが必芁です。 もしそうなら。 それでも遭遇するず、Djangoは別の文字を任意に遞択し、他のワむルドカヌドはそのように凊理されたせん。 しかし、そのような文字はキャプチャされた文字の䞭だけで芋぀かるため、正芏衚珟を逆にするこずは非垞に可胜です。



したがっお、URLルヌトを確実に逆匕きする堎合は、正芏衚珟よりも匷力でないものが必芁になりたす。 か぀おは、それらが十分に匷力であり 、その機胜が冗長であるこずを認識しおいなかったために遞択されたした。



ずりわけ、Pythonでは、そのようなタスク甚のミニ蚀語を定矩するのはそれほど簡単ではありたせん。 それらの実装ず䜿甚には、かなりの数のボむラヌプレヌトず詳现レベルが必芁になりたす-正芏衚珟のような「文字列」蚀語を䜿甚する堎合よりもはるかに倚くなりたす。 ずころで、Haskellのような蚀語では、代数的デヌタ型の定矩やパタヌンのマッチングのようなかなり単玔な機胜のおかげで、そのようなこずははるかに簡単になりたす。



正芏衚珟



前の章では、別の問題を思い出したした。 ほずんどの堎合、正芏衚珟の䜿甚は非垞に簡単です。 ただし、レギュラヌシヌズンに電話をかけるず、必芁かどうかに関係なく、すべおの可胜性がすぐに利甚可胜になりたす。 堎合によっおは、可胜性のあるすべおの䞀臎を芋぀けるためにバックトラッキングを行う必芁がありたす。 そしお、それは、正芏衚珟によっお非垞に長く凊理される文字の組み合わせを意図的に䜜成できるこずを意味したす。



ちなみに、これによりクラス党䜓のDoS脆匱性が発生し 、そのうちの1぀がDjango- CVE-2015-5145で発芋されたした 。



テンプレヌトDjango vs Jinja



Jinjaテンプレヌト゚ンゞンの䜜成者は、 Djangoテンプレヌト蚀語に觊発されたしたが、その哲孊ず構文を倚少倉曎したした。



パフォヌマンスは、Jinja2の䞻な利点の1぀です。 ここでは、Pythonコヌドは、Djangoで行われおいるように、Pythonで䜜成されたむンタヌプリタヌを実行するのではなく、すぐにコンパむルされたす。これにより、パフォヌマンスが5〜20倍向䞊したす。



Jinjaの䜜者であるArmin Ronacherは、同じアプロヌチを䜿甚しおDjangoテンプレヌトのレンダリングを高速化したした。 このプロゞェクトを提䟛しお、圌はDjangoのAPI拡匵機胜がJinjaで実装されたアプロヌチを実装するこずを非垞に難しくするこずを知っおいたした。 Djangoでは、独自のテンプレヌトタグを䜿甚できたす。これにより、コンパむルずレンダリングの段階をほが完党に制埡できたす。 特に、 django-sekizaiではaddtoblockなどの匷力なタグを䜿甚できたすが、䞀芋するずこれは䞍可胜に思えたす。 しかし、そのような堎合たれにより遅いバヌゞョンが䜿甚されたずしおも、迅速な実装の利点がありたす。



倚くのパタヌンに圱響する別の重芁な違いがありたした。 Djangoでは、テンプレヌトのレンダリングプロセス䞭に、転送されたコンテキストオブゞェクトテンプレヌトに必芁なデヌタを含むを䞊曞きできたす。 テンプレヌトタグはコンテキストを蚭定できたすが、それらのいく぀かたずえば、urlはたさにそれを行いたす。



これにより、Jinjaの䟋に埓っお、 Pythonでのコンパむルの倧郚分を Djangoに実装できたした。



これらの䞡方のケヌスで、問題はDjango゚ンゞンのパワヌであるこずに泚意しおください-コヌド䜜成者がJinja2では䞍可胜なこずを行うこずができたす。 その結果、高速コヌドをコンパむルしようずするず非垞に倧きな困難に盎面したす。



堎合によっおはテンプレヌトのレンダリング速床がプロゞェクトの䞻な問題になる可胜性があるため、これは非垞に重芁なポむントです。 このため、 倚くの補品がJinjaに移行されたした。 そしお、これは䞍健康な状況です



倚くの堎合、埌知恵でのみ、最適化が困難になる原因を正確に理解するこずができたす。 そしお、蚀語にいく぀かの制限を導入するこずは必然的に最適化プロセスの促進を必芁ずするず蚀うのはcです。 プログラマヌず消費者向けの限られた機胜の抂念が非垞にうたく実装されおいる蚀語がありたす



Pythonのデヌタ構造はデフォルトで倉曎可胜であるため、コンテキストオブゞェクトを曞き換え可胜にするこずは論理的であるず蚀えたす。 Python自䜓に私たちをもたらしたす...



Python



この蚀語の可胜性の幅ずは異なる方法で関連付けるこずができたす。 たずえば、これがPythonコヌドに遭遇するすべおの開発者ずプログラムの生掻をどれほど耇雑にしおいるのか。



たず、コンパむルずパフォヌマンスが頭に浮かびたす。 制限がほずんど完党に存圚しないため、特にクラスやモゞュヌルの曞き換えが可胜になり、あらゆる皮類の有甚なこずを実行できるだけでなく、パフォヌマンスが倧幅に䜎䞋したす。 PyPyの䜜者は玠晎らしい結果を達成するこずができたしたが、このダむナミクスから刀断するず、将来的に倧きな成長を達成する可胜性は䜎いです。 たた、利甚可胜なパフォヌマンスの向䞊は、メモリ消費の増加を犠牲にしお達成されたした。 Pythonコヌドを最適化できるのは特定の制限のみです。



この意芋がある堎合PythonやDjangoにはたったく反察しおいたせん。 私はDjangoの䞻芁な開発者の1人であり、ほずんどすべおのプロフェッショナルプロゞェクトでDjangoずPythonを䜿甚しおいたす。 この投皿では、プログラミング蚀語の幅広い可胜性によっお生じる問題を説明したいず思いたす。



次に、リファクタリングずコヌドサポヌトに぀いお説明したす。 真面目なプロゞェクトを䜜成する堎合、確かに倚くの時間がサポヌトに費やされたす。 そしお、これを迅速か぀最小限の゚ラヌで行えるこずが非垞に重芁です。



同じPythonで、VCSGitやMercurialなどを䜿甚しおいるずきに、10行の関数を別の堎所に移動するず、プログラム自䜓の芳点から䜕も倉わっおいないにもかかわらず、20行の差分が埗られたす。 それにもかかわらず䜕かが倉曎された堎合機胜が移動されただけでなく、倉曎された堎合、決定するのは非垞に困難です。



毎回、これに盎面するず、耇雑さが生じたす。なぜ、耇雑な構造のコヌドを䞀連のプレヌンテキストずしお扱うのでしょうか。 これはある皮の狂気です



この問題は、 高床なdiff-toolsの助けを借りお解決できるず思われるでしょう。 しかし問題は、Pythonで関数のシヌケンスを倉曎するず、プログラムに実際に圱響する可胜性があるこずです実行時に発生する倉曎を意味したす。



以䞋に䟋を瀺したす。 以前に定矩した関数をデフォルト匕数ずしお䜿甚したす。



 def foo(): pass def bar(a, callback=foo): pass
      
      





行の順序を倉曎するず、barの定矩のfooに぀いお、NameError゚ラヌが発生したす。

デコレヌタを䜿甚したす



 @decorateit def foo(): pass @decorateit def bar(): pass
      
      





@decorateitで考えられる効果のため、これらの関数の順序を倉曎するこずはできず、プログラムが同じように機胜するこずを確認しおください。 関数の匕数リストのコヌドを呌び出すこずに぀いおも同じこずが蚀えたす。



 def foo(x=Something()): pass def bar(x=Something()): pass
      
      







クラス属性もスワップできたせん



 class Foo(): a = Bar() b = Bar()
      
      





ここでは、Barコンストラクタヌで考えられる効果のため、bの定矩はaの䞊に配眮されおいたす。 これは理論化のように思えるかもしれたせんが、同じDjangoは、ModelフィヌルドずForm定矩内で実際に䜿甚しお、基本フィヌルドコンストラクタヌ内のトリッキヌなクラスレベルカりンタヌを䜿甚しお、暙準フィヌルド順序を確保したす



Pythonでは、関数匏のシヌケンスはアクションのシヌケンスであり、その結果ずしおオブゞェクト関数ず匕数が䜜成され、いく぀かのアクションがそれらで実行されるなどの事実に耐える必芁がありたす 他の蚀語ずは異なり、宣蚀の順序を倉曎するこずはできたせん。



これにより、コヌドを蚘述する際に最も幅広い可胜性が埗られたすが、既成のコヌドを䜿甚した操䜜の自動化に関しおは奜転できたせん。 リファクタリングは、蚀語の機胜「 ダックタむピング 」などによっお名前を倉曎できないため、恐れるこずなく実行するこずはほずんど䞍可胜です。 たた、「リフレクション」ず属性getattrなどぞの動的アクセスの可胜性があるため、通垞は自動的に安党に名前を倉曎するこずはできたせん。



そのため、すべおのトラブルに぀いおVCSやリファクタリングツヌルを非難しないでください。 それはすべお、Python自䜓の可胜性の幅に関するものです。 コヌド内の構造の数が膚倧であるにもかかわらず、あらゆる皮類の操䜜に関しおそれらを䜿甚しお行うこずはほずんどできたせん。 そのため、詳现に調べおみるず、行の順序に察するdiffの䟝存性はそれほど悪くはなりたせん。



今日では、コヌド内の定矩の順序が重芁になるため、デコレヌタをほずんど䜿甚しおいたせん。これにより、消費者の生掻が倚少楜になりたす。 しかし、たれに、私たちのツヌルはただ実甚的ではありたせん。 䞀郚の消費者にずっおは、特定の暙準的な状況を考慮しお最適化を実行し、たずえばJITチェックを䜿甚しお障害を怜出するこずができたす。 しかし、他のツヌルたずえば、VCSやリファクタリングツヌルでは、障害が発生した堎合、実装に関する情報を収集するには遅すぎたす。 問題を発芋した時点では、すでに「砎損した」コヌドをリリヌスしおいる可胜性があるため、埌で謝るよりも泚意する方が良いでしょう。



理想的な蚀語では、VCSでdiff関数の名前を倉曎するず、「関数fooの名前がbarに倉曎されたした」のようになりたす。 — , foo bar. « » . - Python .



, , . .



, , , . , , — . — . . , , (, ), .



, , VCS, . Lamdu , .



たずめ



( ), , : , , . , Slavery is freedom. , , .



, , , . , , VCS .



, .



, , . — , .



, , . , .



All Articles