Python 開発では、enum.Enum は定數(shù)のコレクションを定義する強(qiáng)力な方法を提供します。ただし、実際のアプリケーションでは、列挙型メンバー自體の內(nèi)部値を変更せずに、列挙型が複數(shù)の形式の入力を受け入れ、それらを特定の列挙型メンバーに均一にマップできるようにする方法という課題に直面することがよくあります。たとえば、「はい/いいえ」を表す列挙の內(nèi)部値は「Y」と「N」として定義されている可能性がありますが、外部入力を受け取る場(chǎng)合は、「はい」の意味として「true」、「yes」、さらには「T」などの複數(shù)の形式を認(rèn)識(shí)する必要がある場(chǎng)合があります。
この記事では、この問題を解決し柔軟な入力処理を?qū)g現(xiàn)するための enum.Enum の _missing_ クラスメソッドの使い方を具體的な事例を用いて詳しく紹介します。
1. 初期の問題點(diǎn)と課題
「はい」または「いいえ」を表す YesOrNo 列挙を定義するとします。
インポート列挙型 クラスYesOrNo(enum.Enum): はい = 「はい」 いいえ = 「いいえ」
外部入力が「Y」または「N」の場(chǎng)合、対応する列挙型メンバーを直接作成できるようにしたいと考えています。たとえば、YesOrNo("Y") は YesOrNo.YES を取得できます。機(jī)能のこの部分は、デフォルトで enum.Enum によってサポートされます。
ただし、システムが「true」または「false」などのより広範(fàn)囲の入力を受け入れ、それらを YesOrNo.YES および YesOrNo.NO にマップする必要がある一方で、YesOrNo.YES.value が引き続き「Y」であり、YesOrNo.NO.value が依然として「N」である必要がある場(chǎng)合はどうなるでしょうか。 YesOrNo("true") を直接試行すると、"true" が YES または NO の値の中にないため、ValueError がスローされます。
直感的ですが望ましくないアプローチは、列挙定義を変更することです。
# 列挙型クラス YesOrNo(enum.Enum) の內(nèi)部値が変更されるため、変更は推奨されません。 はい = 「本當(dāng)」 いいえ = 「?jìng)巍?/pre>この変更により YesOrNo("true") が機(jī)能するようになりますが、YesOrNo.YES.value は予想どおり "Y" ではなく "true" になります。これは、內(nèi)部値を変更しないようにする必要性と矛盾します。
2. 解決策: _missing_ メソッド
enum.Enum は、列挙コンストラクターに渡された値が列挙メンバーのいずれにも直接一致できない狀況を処理するために設(shè)計(jì)された、_missing_ と呼ばれる特別なクラス メソッドを提供します。このメソッドをオーバーライドすることで、カスタム検索ロジックを?qū)g裝して、非標(biāo)準(zhǔn)入力を正しい列挙メンバーにマップできます。
_missing_ メソッドのシグネチャは通常、_missing_(cls, value) です。ここで、cls は列挙クラス自體、value はコンストラクターに渡された一致しない値です。このメソッドは、対応する列挙メンバーを返す必要があり、デフォルトの動(dòng)作 (ValueError をスロー) を許可するか、一致が見つからない場(chǎng)合は明示的に例外をスローする必要があります。
3. _missing_ メソッドを?qū)g裝する
上記の問題を解決するために _missing_ メソッドを使用した完全な実裝を次に示します。
インポート列挙型 クラスYesOrNo(enum.Enum): はい = 「はい」 いいえ = 「いいえ」 @クラスメソッド def _missing_(cls, value): 「」 このメソッドは、渡された値がどの列挙メンバーにも直接一致しない場(chǎng)合に呼び出されます。 さまざまな形式の入力を YES または NO の列挙メンバーにマップしようとします。 「」 # 大文字と小文字を區(qū)別しない比較のために入力値を小文字に変換します。normalized_value = str(value). lower() ('y'、'yes'、'true'、't') の正規(guī)化値の場(chǎng)合: cls.YES を返す elif 正規(guī)化値 ('n', 'no', 'false', 'f'): cls.NO を返す # 既知のフォームが一致しない場(chǎng)合、デフォルトで Enum が ValueError をスローするようにします # または、スローされる他の例外をカスタマイズできます。 # raise ValueError(f"'{value}' は有効な YesOrNo 値ではありません。")コード分??析:
- @classmethod デコレータ: _missing_ はインスタンスではなく列挙クラス自體を操作するため、クラス メソッドである必要があります。
- cls パラメータ: YesOrNo 列挙クラスを表します。列挙型メンバーには、cls.YES および cls.NO を通じてアクセスできます。
- value パラメーター: これは YesOrNo() コンストラクターに渡される値ですが、どのメンバーにも直接一致しません (たとえば、「true」)。
- Normalized_value = str(value). lower() : マッチング ロジックをより堅(jiān)牢にするために、入力値を文字列に変換し、小文字にします。これにより、「True」や「YES」など、さまざまなケースの入力を処理できます。
- 條件判定:
- Normalized_value が ('y'、'yes'、'true'、't') のいずれかに屬する場(chǎng)合、cls.YES を返します。
- Normalized_value が ('n'、'no'、'false'、'f') のいずれかである場(chǎng)合、cls.NO を返します。
- 欠落一致の処理: _missing_ メソッドが內(nèi)部的に一致を見つけられず、列挙メンバーを返す場(chǎng)合、enum.Enum はデフォルトで ValueError をスローします。この例では、明示的にスローせず、このデフォルトの動(dòng)作に依存します。より具體的なエラー情報(bào)が必要な場(chǎng)合は、手動(dòng)で ValueError(...) を発生させることができます。
4. 使用と検証
ここで、この強(qiáng)化された YesOrNo 列挙をテストできます。
# さまざまな入力をテストします print(f"YesOrNo('Y'): {YesOrNo('Y')}") print(f"YesOrNo('y'): {YesOrNo('y')}") print(f"YesOrNo('YES'): {YesOrNo('YES')}") print(f"YesOrNo('true'): {YesOrNo('true')}") print(f"YesOrNo('T'): {YesOrNo('T')}") print(f"YesOrNo('N'): {YesOrNo('N')}") print(f"YesOrNo('false'): {YesOrNo('false')}") print(f"YesOrNo('no'): {YesOrNo('no')}") # 列挙型メンバーの內(nèi)部値が変更されていないことを確認(rèn)します print(f"YesOrNo.YES.value: {YesOrNo.YES.value}") print(f"YesOrNo.NO.value: {YesOrNo.NO.value}") # 無効な入力を試してください: はいまたはいいえ(「不明」) e としての ValueError を除く: print(f"「不明」のエラー: {e}")出力例:
はいまたはいいえ('Y'): はいまたはいいえ.YES YesOrNo('y'): YesOrNo.YES はいまたはいいえ('YES'): はいまたはいいえ.YES YesOrNo('true'): YesOrNo.YES はいまたはいいえ('T'): はいまたはいいえ.YES YesOrNo('N'): YesOrNo.NO YesOrNo('false'): YesOrNo.NO YesOrNo('no'): YesOrNo.NO はいまたはいいえ。YES.値: Y はいまたはいいえ.NO.値: N 「不明」のエラー: 「不明」は有効な YesOrNo ではありません出力から、「true」、「yes」、または「Y」のいずれであっても、YesOrNo.YES に正常にマップされていることがわかります。一方、YesOrNo.YES.value は依然として「Y」であり、すべてのニーズを満たしています。
5. 予防措置とベストプラクティス
- _missing_ は、直接一致するものがない場(chǎng)合にのみ呼び出されます。渡された値が列挙メンバーの値と直接一致できる場(chǎng)合、_missing_ メソッドは呼び出されません。たとえば、YesOrNo("Y") は直接 YesOrNo.YES を返します。
- 戻り値の型: _missing_ メソッドは列挙メンバー (つまり、cls.MEMBER 形式) を返さなければなりません。そうでない場(chǎng)合は、型エラーがスローされます。
- 例外処理: _missing_ が渡された値を認(rèn)識(shí)しない場(chǎng)合、enum.Enum が ValueError をスローできるようにするか、ビジネス ロジックに基づいたより具體的な例外をスローできるようにする必要があります。 None または列挙のメンバーではないその他の値を返さないでください。
- パフォーマンスに関する考慮事項(xiàng): 非常に大規(guī)模な列挙または高頻度の呼び出しシナリオの場(chǎng)合、_missing_ のロジックは可能な限り効率的である必要があります。マッピング関係が複雑な場(chǎng)合は、事前計(jì)算またはキャッシュに辭書を使用することを検討してください。
- 型変換: _missing_ 內(nèi)では、一般に、値を均一な型 (文字列など) に変換し、それを正規(guī)化 (. lower() など) して多様な入力を処理することをお?jiǎng)幛幛筏蓼埂?/li>
- ドキュメントに関する注記: _missing_ メソッドを含む列挙型を定義する場(chǎng)合、他の開発者が理解して使用できるように、処理する入力タイプとマッピング ルールをクラスまたはメソッドの docstring に明確に記述することをお?jiǎng)幛幛筏蓼埂?/li>
要約する
enum.Enum の _missing_ クラス メソッドをオーバーライドすることで、列挙型の內(nèi)部値を変更せずに、さまざまな入力値を柔軟に処理およびマッピングできる強(qiáng)力なツールが得られます。これにより、列挙の堅(jiān)牢性と使いやすさが大幅に強(qiáng)化され、內(nèi)部データ モデルの一貫性と明確さを維持しながら、コードが外部入力の変更にさらに適応できるようになります。 _missing_ メソッドは、複數(shù)形式の入力を処理する必要がある列挙型を設(shè)計(jì)するときに、検討する価値のあるソリューションであることは間違いありません。
以上がPython Enum の柔軟な入力処理: _missing_ メソッドの深い理解の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

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

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

Stock Market GPT
AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國(guó)語版
中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

このチュートリアルは、PEFT LORAアダプターをベースモデルと効率的にマージして、完全に獨(dú)立したモデルを生成する方法を詳しく説明しています。この記事は、トランスフォーマーを直接使用することは間違っていることを指摘しています。Automodelはアダプターをロードし、重みを手動(dòng)でマージし、PEFTライブラリでMerge_and_unloadメソッドを使用する正しいプロセスを提供します。さらに、このチュートリアルでは、単語セグメントターを扱うことの重要性も強(qiáng)調(diào)し、PEFTバージョンの互換性の問題とソリューションについて説明しています。

Pipinstall-rrequirements.txtを?qū)g行して、依存関係パッケージをインストールします。競(jìng)合を回避し、ファイルパスが正しく、PIPが更新されていることを確認(rèn)し、必要に応じて-no-depsや-userなどのオプションを使用して、必要に応じてインストール動(dòng)作を調(diào)整することを確認(rèn)して、最初に仮想環(huán)境を作成およびアクティブ化することをお?jiǎng)幛幛筏蓼埂?/p>

Pythonは、Pythonのシンプルで強(qiáng)力なテストツールです。インストール後、命名ルールに従ってテストファイルが自動(dòng)的に発見されます。アサーションテストのためにtest_から始まる関數(shù)を書き込み、 @pytest.fixtureを使用して再利用可能なテストデータを作成し、pytest.raisesを使用して例外を確認(rèn)し、指定されたテストと複數(shù)のコマンドラインオプションをサポートし、テスト効率を改善します。

theargparsemoduleisttherecommendedwayto handlecommand-lineargumentsinpython、robustparsing、typevalidation、helpmessages、およびerrorhandling; ousesys.argvforsimplecasesrequiringminimalsetup。

この記事の目的は、PythonとNumpyの浮動(dòng)小數(shù)點(diǎn)數(shù)の計(jì)算精度が不十分であるという一般的な問題を調(diào)査し、その根本原因は標(biāo)準(zhǔn)64ビットの浮動(dòng)小數(shù)點(diǎn)數(shù)の表現(xiàn)制限にあることを説明しています。より高い精度を必要とするシナリオを計(jì)算するために、この記事では、MPMATH、Sympy、GMPYなどの高精度數(shù)學(xué)ライブラリの使用方法、機(jī)能、および適用可能なシナリオを?qū)毪筏票容^し、読者が複雑な精度のニーズを解決するための適切なツールを選択できるようにします。

この記事では、PEFTライブラリのMERGE_AND_UNLOAD関數(shù)を使用して、LORAアダプターを基本的な大手言語モデルに効率的かつ正確に統(tǒng)合する方法を詳しく説明します。この記事では、アダプターの読み込みとトランスを介してモデルの重みを手動(dòng)で統(tǒng)合することに関する一般的な誤解を修正し、モデルのマージ、単語セグメントター処理、潛在的なバージョン互換性の問題を解決するための専門的なガイダンスを含む完全なコード例を提供します。

@ContextManagerFromContextLibandDefineAgeneratoratoraturationは、sexactlyOnceを使用します

PYPDF2、PDFPlumber、およびFPDFは、PDFを処理するPythonのコアライブラリです。 pypdf2を使用して、pdfreaderを介してページを読み取り、extract_text()を呼び出してコンテンツを取得するなど、テキスト抽出、マージ、分割、暗號(hào)化を?qū)g行します。 PDFPlumberは、レイアウトテキストの抽出とテーブル認(rèn)識(shí)を保持するのに適しており、Extract_Tables()をサポートしてテーブルデータを正確にキャプチャします。 FPDF(推奨されるFPDF2)はPDFを生成するために使用され、ドキュメントが構(gòu)築され、add_page()、set_font()、およびcell()を介して出力されます。 PDFSをマージすると、PDFWriterのAppend()メソッドは複數(shù)のファイルを統(tǒng)合できます
