>백엔드 개발 >파이썬 튜토리얼 >Python 및 FastAPI Pydantic 클래스에서 ** 연산자 사용

Python 및 FastAPI Pydantic 클래스에서 ** 연산자 사용

王林
王林원래의
2024-08-31 12:32:12951검색

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

Python의 ** 연산자는 상황에 따라 다르며 함께 사용되는 대상에 따라 달라집니다. 숫자(일반적으로 두 숫자 사이)와 함께 사용하면 지수 연산자 역할을 합니다. 그러나 이 글에서는 그것이 사용되는 또 다른 맥락을 살펴볼 것입니다. Python 사전의 압축을 풀 때 사용되는 압축해제 연산자로서의 사용법을 살펴보겠습니다.

Python으로 코딩해본 사람이라면 누구나 **kwargs를 본 적이 있을 것입니다. 키워드 인수의 약어입니다. 이는 키 = 값 구문의 함수에 전달되는 인수입니다. 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를 호출하면 인스턴스 기술이 반환됩니다.

클래스에서 ** 연산자는 각 키-값 쌍이 클래스 생성자에 명명된 인수로 전달될 수 있도록 사전의 압축을 풉니다.

이 섹션의 예에서는 클래스를 정의합니다. 클래스 매개변수와 일치하는 속성을 사용하여 사전을 정의합니다. 그런 다음 **를 사용하여 사전의 압축을 풀고 클래스의 인스턴스를 만듭니다.

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" 
)

사용의 이점

이제 unpacking 연산자를 사용하는 것이 유익한 몇 가지 상황을 살펴보겠습니다.

  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.