「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python および FastAPI Pydantic クラスでの ** 演算子の使用

Python および FastAPI Pydantic クラスでの ** 演算子の使用

2024 年 8 月 31 日に公開
ブラウズ:379

The Use of The ** Operator With Python and FastAPI Pydantic Classes

Python の ** 演算子はコンテキストに依存するか、使用される内容に依存します。数値 (通常は 2 つの数値の間) とともに使用すると、べき乗演算子として機能します。ただし、この記事では、それが使用される別のコンテキストについて見ていきます。 Python 辞書を解凍するために使用される 解凍演算子 としての使用法を見ていきます。

Python でコーディングしたことがある人なら、**kwargs を見たことがあるはずです。キーワード引数の略称。これらは、key = value 構文で関数に渡される引数です。 kwargs は、関数に渡されるキーワード引数の数がわからない場合に使用されます。 **kwargs は辞書型であり、辞書を関数に渡すのと同じくらい機能します。この辞書には次の内容が含まれています:

    引数名に対応するキー。
  • 引数の値に対応する値。
このロジックに従って、この記事では、Pydantic クラスを使用した FastAPI でのユース ケースに至るまで、Python でのユース ケースを見ていきます。

次の点を見ていきます。

    Python 関数と一緒に使用します。
  • Python クラスで使用します。
  • FastAPI Pydantic クラスで使用します。
  • 使用のメリット
注: kwargs を使用することは必須ではありません。他の命名規則を使用することもできます。 **myArgs、**何でもなど

前提条件

    Python のクラスと関数の知識。
  • FastAPI の基本的な知識。
Python 関数で使用する

この例では、いくつかのキーワード引数を **kwargs として関数に渡します。**kwargs は辞書であるため、それに辞書メソッド .items() を使用します。 .items() メソッドは、ディクショナリのキーと値のタプル ペアのリストを表示するビュー オブジェクトを返します。


def print_details(**kwargs): # kwargs はすべてのキーワード引数を含む辞書です print(type(kwargs)) # 出力: print(kwargs.items()) # 辞書項目 (キーと値のペア) を表示します # kwargs 内のキーと値のペアを反復処理します。 kwargs.items() のキーと値の場合: print(f"{キー}: {値}") # 複数のキーワード引数を指定して関数を呼び出す print_details(名前=スティーブン、年齢=30、職業=ソフトウェア開発者)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")

出力

dict_items([('名前', 'スティーブン'), ('年齢', 30), ('職業', 'ソフトウェア開発者')]) 名前:スティーブン 年齢: 30歳 職業: ソフトウェア開発者
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
Python クラスで使用する

もうお気づきかと思いますが、Python クラスは呼び出し可能です。これは、関数を呼び出すのと同じ方法でクラスを呼び出すことができることを意味します。クラスを呼び出すと、そのクラスのインスタンス (オブジェクト) が作成されます。


クラスの技術: def __init__(self、dev、devops、design): self.dev = 開発 self.devops = devops self.design = デザイン # クラスを呼び出してインスタンスを作成する tech = 技術(開発、開発、設計)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
引数値を指定して Tech を呼び出すと、インスタンス tech が返されます。

クラスでは、** 演算子によって辞書が解凍され、各キーと値のペアを名前付き引数としてクラス コンストラクターに渡すことができるようになります。

このセクションの例では、クラスを定義します。クラスパラメータに一致するプロパティを含む辞書を定義します。次に、** を使用して辞書を解凍し、クラスのインスタンスを作成します。


クラスの技術: def __init__(self、dev、devops、design): self.dev = 開発 self.devops = devops self.design = デザイン # クラスのパラメータに一致するプロパティを含む辞書を定義します 技術チーム = { '開発者': 'スティーブン', 'devops': ['ジェニー'、'ラキーム'、'スタンリー']、 「デザイン」: 「カルロス」 } # ** を使用してクラスのインスタンスを作成し、辞書を解凍します 技術 = 技術(**技術チーム) 印刷(tech.dev) print(tech.devops) プリント(テックデザイン)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
上記のコードは次と同等です:


クラスの技術: def __init__(self、dev、devops、design): self.dev = 開発 self.devops = devops self.design = デザイン # クラスのパラメータに一致するプロパティを含む辞書を定義します 技術チーム = { '開発者': 'スティーブン', 'devops': ['ジェニー'、'ラキーム'、'スタンリー']、 「デザイン」: 「カルロス」 } # クラスのインスタンスを作成する 技術 = 技術( dev = tech_team["dev"], devops = tech_team["devops"], デザイン = tech_team["デザイン"] ) 印刷(tech.dev) print(tech.devops) プリント(テックデザイン)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
その理由:


tech = 技術(**Tech_team)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
次と同じです:


技術 = 技術( dev = tech_team["dev"], devops = tech_team["devops"], デザイン = tech_team["デザイン"] )
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
FastAPI Pydantic クラスで使用する

Pydantic はデータ検証に使用される Python ライブラリであり、Python3 の型ヒント システムを使用することで、Python で最も広く使用されているデータ検証ライブラリとしても宣伝されています。 FastAPI で採用されているこの Pydantic は、簡単に言えばクラスであるデータ モデルを定義するのに役立ちます。

クラスでは、属性またはフィールドの型 (str、int、float、List など) を指定できます。データが提供されると、Pydantic はそれが一致することを確認します。

これに加えて、Pydantic は解析とシリアル化を支援します。シリアル化は、データ オブジェクトを送信しやすい形式に送信するプロセスです。たとえば、シンプルで解析しやすいように、オブジェクトまたは配列を JSON 形式に変換します。

Pydantic には、定義されたクラスが継承する BaseModel クラスがあります。以下は Pydantic モデルの例です:


pydanticインポートBaseModel、EmailStrから # Pydantic から BaseModel と Emailstr タイプをインポートします クラスUserInDB(BaseModel): ユーザー名: str ハッシュ化されたパスワード: str 電子メール: EmailStr full_name: Union[str, None] = なし
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
次があるとします:


クラス項目(BaseModel): 名前:str 価格:フロート app = FastAPI() @app.post("/items/") async def create_item(item:Item): 返品商品
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
上記のコードでは、リクエストボディパラメータである item は、Item モデルのインスタンスです。これは、受信した JSON リクエスト本文を検証してシリアル化し、Item モデルで定義された構造と一致することを確認するために使用されます。

Pydantic の .dict() メソッド

Pydantic モデルには、モデルのデータを含む辞書を返す .dict() メソッドがあります。

pydantic モデル インスタンスを作成する場合:


item = アイテム(名前=サンプルアイテム、価格=5.99)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
次に、それを使用して dict() を呼び出します:


itemDict = item.dict() print(itemDict)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
これで辞書が完成し、出力は次のようになります:


{ "名前": "サンプルアイテム", 「価格」:5.99 }
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
ご了承ください:


アイテム(名前=サンプルアイテム、価格=5.99)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")

と同等です

# アンパック演算子の使用 アイテム(**itemDict) # または アイテム( name=itemDict["名前"]、price=itemDict["価格" )
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
使用のメリット

次に、アンパック演算子の使用が有益ないくつかの状況を見ていきます。

    エントリを追加または変更して、既存の辞書から新しい辞書を作成します。
original_dict = {"名前": "スティーブン"、"年齢": 30、"職業": "ソフトウェア開発者"} # 追加または変更されたエントリを含む新しい辞書の作成 new_dict = {**original_dict, "年齢": 31, "場所": "ニューヨーク"} print(new_dict)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
    辞書を 1 つに結合します。アンパック演算子を使用すると、複数の辞書をマージできます。
default_config = {"テーマ": "ライト", "通知": True} user_config = {"テーマ": "ダーク"} # 解凍を使用した辞書のマージ Final_config = {**default_config, **user_config} print(final_config)
def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: 
    print(kwargs.items())  # Displays the dictionary items (key-value pairs)

    # Iterate over the key-value pairs in kwargs
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple keyword arguments
print_details(name="Stephen", age=30, profession="Software Developer")
    関数内の引数を動的に処理します。これは初期の例で見ることができます。
結論

辞書アンパック演算子 ** は、関数やクラスの引数の処理、および新しい辞書のマージと作成における動的な性質のため、使用を検討する必要があります。これらすべてを組み合わせると、コードが減り、コードのメンテナンスが改善されます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/stevePurpose/the-use-of-the-operator-with-python-and-fastapi-pydantic-classes-2aj?1 侵害がある場合は、study_golang にご連絡ください。 @163.com 削除
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3