私は現在、Pyodide 上に構築された Zenaura という UI フレームワークに取り組んでいます。最近、ビルダー インターフェイス (ユーザーが UI 要素を作成する主な方法) が少し複雑すぎて魅力がないことに気づきました。 Zenaura の仮想 DOM「ノード」データ構造と対話するための、基盤となるより煩雑なインターフェイスを抽象化しましたが、それでも満足のいくものではありませんでした。私は、まったく新しい構文用のコンパイラーを開発する可能性があるための基礎を築きながら、物事を簡素化し、よりクリーンで直感的なエクスペリエンスをユーザーに提供したいと考えていました。このようなもの:
div(attr1=val1, child1, child2, child3)
現在のビルダー インターフェイスは低レベルすぎてユーザーフレンドリーではありません。ユーザーは次のような操作を行う必要はありません:
builder = Builder(name__) if children: builder.with_children(*children) if attributes: builder.with_attributes(**attributes) if text: builder.with_text(text) # print("data", builder.node.children, builder.node.attributes) return builder.build()
代わりに、次のような、よりクリーンで読みやすい構文を使用できるようにする必要があります。
div(id="some-id", h1("text"), p("text"))
MDN ドキュメントを見ると、HTML タグが 91 個あり、追加または廃止される可能性があります。私は最初、このプロセスを簡素化するためにコードを動的に生成することを検討しましたが、それは機能しますが、最も実用的な解決策ではありません。主な目標は、ユーザーが関数を呼び出すたびにドキュメント文字列を表示することでしたが、動的に生成されるアプローチでは、オートコンプリートの欠如など、いくつかの課題が生じます。
これが私が実験した動的に生成されたコードです:
tag_config = { # root elements "html": "nestable", "main": "nestable", "body": "nestable", } tags_factory = { "nestable": lambda name__: f""" {name__} = partial(nestable, "{name__}") {name__}.__doc__ = nestable.__doc__ """, "textable": lambda name__: f""" {name__} = partial(textable, "{name__}") """, "self_closing": lambda name__: f""" {name__} = partial(self_closing, "{name__}") """, "nestable_no_attrs": lambda name__: f""" {name__} = partial(nestable_no_attrs, "{name__}") """ } for k, v in tag_config.items(): exec(tags_factory[v](k), globals())
これは機能の点ではうまく機能しますが、使いやすさの点では不十分です。主な欠点は、コードが実行時に挿入されるため、オートコンプリートがないことです。ただし、HTML タグ自体は比較的単純なので、現時点ではそれほど心配する必要はありません。
このアプローチの重要な利点の 1 つは柔軟性です。 Zenaura での HTML 要素のサポートまたは非推奨は、tag_config ディクショナリにキーと値のペアを追加または削除するのと同じくらい簡単です。これは、時間の経過による HTML タグの変更に適応する簡単な方法です。
さらに、唯一の制限はオートコンプリートとユーザーへのドキュメント文字列の表示です。HTML 要素は非常に基本的なものであるため、これはトレードオフとして問題ないと思います。
しかし、そのトレードオフは使いやすさという形で現れます。オートコンプリートがないと、ユーザーはインターフェイスを操作するときに課題に直面する可能性があります。そうは言っても、これは Zenaura でタグ要素を処理する新しい方法を実験するための良い出発点であると私は信じています。
以上がPython のランタイム メタプログラミング パターンは興味深いですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。