componentという機能を追加した。欲しくなったのかなどを思考の整理のためにメモしておく。componentという名前は独自の名前で暫定的な名前。通常のcomponentは名前と型によってmappingされる。componentは戻り値の型のみによってmappingされる。component例えば以下のコードのuse()上でFooオブジェクトを利用しているが、これは登録した関数名と引数名が一致している必要があった。以下のように利用する側も登録する側もfooという名前を利用していれば問題なく取得できた。run()一方で利用する側と名前が食い違っていた場合にはエラーになっていた。以下の様なfとfooのような名前が一致していないコードはエラーになっていた。founddefault_component一方、default_componentは型のみによって取得されるので以下の様な名前が一致していないコードも動く。0x1104ec3a0>resolve_args()ちなみにいちいちコマンドとして実行しなくても、以下の様な形で依存を注入した結果を取得する事ができる。componentが欲しくなったか?理由をメモしておく。これは特定のusecaseにおけるdefault実装を用意したいと思ったため。botのそれぞれにおいてreply_message()のような操作を持つオブジェクトを考えてみる。以下の様なProtocolを満たすもの。...このReplierはCLIでは単純にstdoutに出力するだけのものかもしれない。bot用のそれなら特定のメッセージへのreplyとして返すような実装になるだろう。self.internal.reply(text)さて、ここでmonogusaの機能について振り返ってみると「既存の関数定義を色々なやり方で公開する機能」というような位置づけのものになる。monogusa.chatbot.discordbot)ここで例えばslackbot用の実装を利用するcomponentを考えたときに、default実装を要求したくなることがあった。2まだ、未実装だが、例えばある特定のメッセージに反応を返すbotを考えたときにこの種の機能が欲しくなる。replier.reply_message("OK")ここで、元のメッセージへの反応をするためにどうすれば良いかわからなくなる。そこで例えば先程言及したような振る舞いを持つオブジェクトがそれぞれのcontext上で登録されているとする。そのような場合はそのオブジェクトを利用して反応を返してあげれば良い。それぞれのusecaseごとにReplierというprotocolを実装したcomponentが存在しているというイメージ。(あるいはMessageEvent自体がreplyみたいなメソッドを持つ未来もあるかもしれない。replierがそれ以外の名前の引数として扱われた場合にエラーになるのは嬉しくない。Replierなどが許されないとするとちょっと厳しい。引数名の部分はimportして利用したりなどが不可能なものなので、登録されているcomponentの名前を事前に知っておく必要がでてくる。これは使い勝手が悪い。hintの部分つまり型の部分に関しては値なのでimport可能なものになる。これを利用することには意味がある。componentが欲しくなった。componentという世界観も考えられる。nameと型がセットのcomponent。型だけからマッピングされるcomponent。これはやってやれないことはないけれど。同じ型を違う形で使うことが難しくなる。クラスとインスタンスの関係は通常1:Nなのにも関わらず1:1を暗黙に課すというのは気持ち悪いように感じる。同じミドルウェアに接続するオブジェクトだがリクエスト先が異なるようなものに関しても型レベルで分ける必要がある(といっても継承するだけといえばそれだけだけれど)。それがデフォルトなのは気持ち悪いように感じる。基本的にはstrictな通常のcomponentの方をユーザーが使うという方向になるような気がしている。assertionが入るので、runtime_checkable()を付ける必要がある。factoryを記述するタイミングでmypyでチェックされるならこのassertionは無効にしても良いかもしれない。abcモジュールを使って仮想継承させる形にしてProtocolを使わないという方法もあるかもしれない。ZCAのように継承関係を見るということまではしないつもり。monogusaのweb周りを更新した。monogusaというパッケージを作りはじめた。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。