フォローアップのインタビュー セッションを待っている間、退屈から、genruler を利用したステート マシン ライブラリを構築しました。私は過去、正確に言うと卒業後の最初の仕事のときにこれを作りました。この実装は、当時私の上司が起草した設計に大まかに基づいています。このプロジェクトは、ルール DSL の活用方法を紹介することも目的としていました。
有限状態マシンに関する Google 検索で返された有用な概要によると (強調は私のものです)
「有限状態マシン」 とは、システムがいつでも限られた数の個別の状態しか取り得ない計算モデルを意味し、これらの状態間の遷移は特定の入力によってトリガーされ、本質的には無限の数の状態が存在する可能性のない一連の定義された条件に基づいて情報を処理します。ここでの「有限」 は、システムが存在できる限られた状態のセットを指します。
ライブラリは、有限状態マシンのスキーマを表す辞書を受け取ります。たとえば、注文追跡システムを構築したいと考えています
Graphviz によって生成された有限状態マシン図
スキーマは次のようになります (わかりやすくするために YAML 形式を省略しています)
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
したがって、すべてを設定するには、
を呼び出します。
import genstates import yaml import order_processor with open("states.yaml") as schema: machine = genstates.Machine(yaml.safe_load(schema), order_processor)
つまり、この架空の例では、順序に変更があるたびに何らかのペイロードを受け取ることになります。たとえば、販売者が注文を承認すると、
が返されます。
{ "is_authorized": true, ... }
これでライブラリを確認できるようになります
state = machine.initial # assume the order is created transition = machine.get_transition(state, "order_authorization") assert transition.check_condition(payload)
スキーマで定義されている場合、このチェックでは追加の検証チェックも実行されます。これは、呼び出し元にエラー メッセージを返す場合に役立ちます。
try: assert transition.check_condition(payload) except ValidationFailedError as e: logger.exception(e)
ペイロードが到着するたびに遷移をトリガーする必要があることがわかっている場合もありますが、どの遷移であるかは必ずしもわかりません。したがって、それを Machine.progress
に渡すだけです。
try: state = machine.progress(state, payload) except ValidationFailedError as e: logger.exception(e)
注文がどのような状態に進むべきかがわかったら、ロジックを操作するためのコードを書き始めることができます
# fetch the order from database order = Order.get(id=payload["order_id"]) current_state = machine.states[order.state] # fetch next state try: new_state = machine.progress(current_state, payload) except ValidationFailedError as e: # validation failed, do something logger.exception(e) return except MissingTransitionError as e: # can't find a valid transition from given payload logger.exception(e) return except DuplicateTransitionError as e: # found more than one transition from given payload logger.exception(e) return # do processing (example) log = Log.create(order=order, **payload) log.save() order.state = new_state.key order.save()
理想的には、処理ロジックを抽出することもできます。これが、最初に order_processor をインポートした理由です。認可状態の定義では、アクション
も定義しました。
authorized: name: authorized action: authorize_order ...
モジュール order_processor で、authorized_order という新しい関数を定義します
def authorize_order(payload): # do the processing here instead pass
状態管理コードが残りの処理ロジックから分離されている場合、次のことが可能です
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
ただし、現在も作業中なので、次のリリースで作成する予定です。一方、すべての状態にアクションが定義されている場合は、マップとリデュースに似た処理を実行することもできます。開発の進捗状況については、プロジェクトをご自由にチェックしてください。そして、genruler と genstates の両方が PyPI 上で稼働するようになりました。やったー!
では、AI についてはどうでしょうか?
ライブラリがある程度使えるようになったので、Codeium Windsurf をダウンロードしました。私は最終的にこれを使用して genruler から依存関係を取り除き、ドキュメントと README をプロジェクトに追加しました。 genstate については、カスケードを使用してドキュメント、README、およびテストを生成しました。全体として、インターンや後輩に割り当てるタスクを手伝ってくれる中堅から上級のプログラマーがそばにいるように感じます。
コアロジックのほとんどは依然として私の側から来ており、言語モデルは現時点ではインテリジェントですが、依然としてあちこちで間違いがあり、したがって監督が必要です。また、qwen2.5-coder:7b モデルも試してみましたが、私のワークステーションが貧弱なため、かなり遅いとはいえ、かなりうまく動作しました。私が独自の製品を構築し、それからなんとかお金を稼ぐのであれば、Codeium が要求する価格は公正であると思います。
生成部分は問題なく動作しますが、実際のコードを書くのはそれほどうまくいきません。 Pylance がそこで適切に動作しているのか、プロプライエタリであると考えられているのか、それともウィンドサーフィンの補完マジックによるものなのかはわかりません。コードを書くときにエディターがライブラリの自動インポートを行うことができなくなりました。たとえば、コード内でreduce()関数をオートコンプリートすると、vscodeではfunctools import reduceが魔法のようにコードに自動的に挿入されます。しかし、ウィンドサーフィンではそうはいかないので、少しイライラします。ただし、これは新しいものであることを考慮すると、コーディング エクスペリエンスは時間の経過とともに修正されるはずです。
一方で、私はまだ軽量のエディタを探しており、zed が私の注意を引きました。しかし、最近 Surface Book 2 が壊れたので、自宅のオフィスから離れているときは Samsung Galaxy Tab S7FE だけが手元に残っています。したがって、ワークステーションに接続された Web フロントエンド (そして驚くほど使いやすい) を備えた vscode が、今でも私のメインエディターです (neovim 拡張機能でも動作します)。
LLM を活用した生成 AI は私たちの生活を急速に変えつつあり、それに抵抗する意味はありません。しかし、私見ですが、それをあらゆることに使用しないように、ある程度の自制心も持つべきです。これは実際、革新的または創造的な仕事を補完するものとして使用されるべきであり、イノベーションや創造性の代替として使用されるべきではありません。
また、その動作を盲目的に受け入れるのではなく、それが何を出力しているのかを知る必要があります。たとえば、genruler では、より広範な例を使用して元の README を改善しました。これをそのまま受け入れるのではなく、README で生成されるすべてのサンプルのテストを生成するようにしました。そのため、サンプル コードは意図したとおりに通過し、動作します。
全体的に見て、はい、これらの Generative AI 強化エディターには、要求する金額に見合った価値があると思います。結局のところ、これらはツールであり、作業を補助するものであり、キーボードを打つ人の代わりをするものではありません。
以上がAI ツールを活用したステート マシン ライブラリの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ThedifferencebetweenaforloopandawhileloopinPythonisthataforloopisusedwhenthenumberofiterationsisknowninadvance,whileawhileloopisusedwhenaconditionneedstobecheckedrepeatedlywithoutknowingthenumberofiterations.1)Forloopsareidealforiteratingoversequence

Pythonでは、ループの場合は、反復の数がわかっている場合に適していますが、ループは反復の数が不明で、より多くの制御が必要な場合に適しています。 1)ループの場合は、簡潔なコードとPythonicコードを使用して、リスト、文字列などのトラバーシーケンスに適しています。 2)条件に応じてループを制御する必要がある場合やユーザーの入力を待つ必要がある場合、ループがより適切ですが、無限のループを避けるために注意を払う必要があります。 3)パフォーマンスに関しては、FORループはわずかに高速ですが、通常、違いは大きくありません。適切なループタイプを選択すると、コードの効率と読みやすさが向上します。

Pythonでは、リストを5つの方法でマージできます。1)シンプルで直感的なオペレーターを使用して、小さなリストに適しています。 2)extend()メソッドを使用して、頻繁に更新する必要があるリストに適した元のリストを直接変更します。 3)要素上でリストの分析式、簡潔、動作を使用する。 4)itertools.chain()関数を使用して効率的なメモリになり、大規模なデータセットに適しています。 5)要素をペアにする必要があるシーンに適しているように、 *演算子とzip()関数を使用します。各方法には特定の用途と利点と短所があり、選択する際にはプロジェクトの要件とパフォーマンスを考慮する必要があります。

forlopseused whenthentheNumberofiterationsiskが、whileloopsareuseduntiLaconditionismet.1)forloopsareideal for sequenceslikelists、usingsintaxlike'forfruitinfruits:print(fruit) '.2)

toconcatenatealistoflistsinpython、useextend、listcomprehensions、itertools.chain、またはrecursivefunctions.1)extendistraighttraightrawardbutverbose.2)listcomprehesionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsised effective forlargerdatasets.3)itertools.chainmerymery-emery-efforience-forforladatas

Tomergelistsinpython、あなたはオペレーター、extendmethod、listcomfulting、olitertools.chain、それぞれの特異的advantages:1)operatorissimplebutlessforlargelist;

Python 3では、2つのリストをさまざまな方法で接続できます。1)小さなリストに適したオペレーターを使用しますが、大きなリストには非効率的です。 2)メモリ効率が高い大規模なリストに適した拡張方法を使用しますが、元のリストは変更されます。 3)元のリストを変更せずに、複数のリストをマージするのに適した *オペレーターを使用します。 4)Itertools.chainを使用します。これは、メモリ効率が高い大きなデータセットに適しています。

Join()メソッドを使用することは、Pythonのリストから文字列を接続する最も効率的な方法です。 1)join()メソッドを使用して、効率的で読みやすくなります。 2)サイクルは、大きなリストに演算子を非効率的に使用します。 3)リスト理解とJoin()の組み合わせは、変換が必要なシナリオに適しています。 4)redoce()メソッドは、他のタイプの削減に適していますが、文字列の連結には非効率的です。完全な文は終了します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 中国語版
中国語版、とても使いやすい
