ホームページ  >  記事  >  バックエンド開発  >  Python および FastAPI Pydantic クラスでの ** 演算子の使用

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

王林
王林オリジナル
2024-08-31 12:32:12946ブラウズ

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

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

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

  • 引数名に対応するキー。
  • 引数の値に対応する値。

このロジックに従って、この記事では、Python でのユース ケースを見て、Pydantic クラスを使用した FastAPI でのユース ケースを構築していきます。

以下の点を見ていきます。

  • Python 関数と一緒に使用します。
  • Python クラスで使用します。
  • FastAPI Pydantic クラスで使用します。
  • 使用の利点

注: kwargs を使用することは必須ではありません。他の命名規則を使用することもできます。 **myArgs、**何でもなど

前提条件

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

Python 関数で使用する

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

def print_details(**kwargs):
    # kwargs is a dictionary containing all keyword arguments
    print(type(kwargs))  # Output: <class 'dict'>
    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")

出力

<class 'dict'>

dict_items([('name', 'Stephen'), ('age', 30), ('profession', 'Software Developer')])

name: Stephen
age: 30
profession: Software Developer

Python クラスで使用する

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

class Tech:
    def __init__(self, dev, devops, design):
        self.dev = dev
        self.devops = devops
        self.design = design
# Call class to create an instance
tech = Tech(dev, devops, design)                

引数値を指定して Tech を呼び出すと、インスタンス tech が返されます。

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

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

class Tech:
    def __init__(self, dev, devops, design):
        self.dev = dev
        self.devops = devops
        self.design = design

# Define a dictionary with properties matching the class's parameters
tech_team = {
    'dev': 'Stephen',
    'devops': ['Jenny', 'Rakeem', 'Stanley'],
    'design': 'Carlos'
}

# Create an instance of the class using ** to unpack the dictionary

tech = Tech(**tech_team)
print(tech.dev)
print(tech.devops)
print(tech.design)

上記のコードは次と同等です:

class Tech:
    def __init__(self, dev, devops, design):
        self.dev = dev
        self.devops = devops
        self.design = design


# Define a dictionary with properties matching the class's parameters
tech_team = {
    'dev': 'Stephen',
    'devops': ['Jenny', 'Rakeem', 'Stanley'],
    'design': 'Carlos'
}

# Create an instance of the class 
tech = Tech(
    dev = tech_team["dev"],
   devops = tech_team["devops"],
  design = tech_team["design"]
)

print(tech.dev)
print(tech.devops)
print(tech.design)

その理由は次のとおりです:

tech = Tech(**Tech_team)

次と同じです:

tech = Tech(
    dev = tech_team["dev"],
   devops = tech_team["devops"],
  design = tech_team["design"]
)

FastAPI Pydantic クラスで使用する

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

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

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

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

from pydantic import BaseModel, EmailStr
# We import the BaseModel and Emailstr type from Pydantic

class UserInDB(BaseModel):
    username: str
    hashed_password: str
    email: EmailStr
    full_name: Union[str, None] = None

次があると仮定します。

class Item(BaseModel):
   name:str
   price:float

app = FastAPI()
@app.post("/items/")
async def create_item(item:Item):
   return item

上記のコードでは、リクエストボディパラメータである item は、Item モデルのインスタンスです。これは、受信した JSON リクエスト本文を検証してシリアル化し、アイテム モデルで定義された構造と一致していることを確認するために使用されます。

Pydantic の .dict() メソッド

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

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

item = Item(name="sample item", price=5.99)

次に、それを使用して dict() を呼び出します。

itemDict = item.dict()
print(itemDict)

これで辞書が完成し、出力は次のようになります:

{
"name": "sample item",
"price":5.99
}

次の点に注意してください:

Item(name="sample item", price=5.99)


と同等です

# Using the unpacking operator
Item(**itemDict)

# Or 

Item(
  name=itemDict["name"], price=itemDict["price" 
)

使用のメリット

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

  • Creating new dictionaries from a pre-existing dictionary by adding or modifying entries.
original_dict = {"name": "Stephen", "age": 30, "profession": "Software Developer"}

# Creating a new dictionary with additional or modified entries
new_dict = {**original_dict, "age": 31, "location": "New York"}
print(new_dict)
  • Joining dictionaries into one. With the unpacking operator we can merge multiple dictionaries.
default_config = {"theme": "light", "notifications": True}
user_config = {"theme": "dark"}

# Merging dictionaries using unpacking
final_config = {**default_config, **user_config}
print(final_config)
  • Handling of arguments in functions in a dynamic manner. This can be seen in our early examples.

Conclusion

The dictionary unpacking operator ** is one to consider using because of its dynamic nature of handling arguments in functions and classes, and in merging and creation of new dictionaries. All these put together leads to lesser code and better maintenance of code.

以上がPython および FastAPI Pydantic クラスでの ** 演算子の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。