”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Python 和 FastAPI Pydantic 类中 ** 运算符的使用

Python 和 FastAPI Pydantic 类中 ** 运算符的使用

发布于2024-08-31
浏览:215

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

Python 中的 ** 运算符是上下文相关的或取决于它的使用对象;当与数字一起使用时(通常在两个数字之间),它用作 求幂运算符 。然而,在本文中,我们将研究使用它的另一个上下文。我们将研究它作为解包运算符的用途,用于解包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: 
    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([('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 请求正文,以确保其与 Item 模型中定义的结构匹配。

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

使用的好处

我们现在将看看使用拆包运算符是有益的一些情况。

  • 通过添加或修改条目从预先存在的词典创建新词典。
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)
  • 将字典合二为一。使用解包运算符,我们可以合并多个字典。
default_config = {"theme": "light", "notifications": True}
user_config = {"theme": "dark"}

# Merging dictionaries using unpacking
final_config = {**default_config, **user_config}
print(final_config)
  • 以动态方式处理函数中的参数。这可以在我们早期的示例中看到。

结论

字典解包运算符 ** 是值得考虑使用的一个,因为它具有处理函数和类中的参数以及合并和创建新字典的动态特性。所有这些放在一起可以减少代码并更好地维护代码。

版本声明 本文转载于:https://dev.to/stevepurpose/the-use-of-the-operator-with-python-and-fastapi-pydantic-classes-2aj?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Hacktoberfest 周在线拍卖系统
    Hacktoberfest 周在线拍卖系统
    概述 在 Hacktoberfest 的第三周,我决定为一个较小但有前途的项目做出贡献:在线拍卖系统。尽管该项目仍处于早期阶段,但它已经显示出增长潜力,而且我看到了帮助改进其代码库的机会。我的任务是通过减少冗余代码和改进整体结构来重构项目,使其更具可维护性和可扩展性。 ...
    编程 发布于2024-11-06
  • 如何使用“exception_ptr”在 C++ 线程之间传播异常?
    如何使用“exception_ptr”在 C++ 线程之间传播异常?
    在 C 中的线程之间传播异常 当从主线程调用的函数生成多个线程时,就会出现在 C 中的线程之间传播异常的任务用于 CPU 密集型工作的工作线程。挑战在于处理工作线程上可能发生的异常并将其传播回主线程​​以进行正确处理。传统方法一种常见方法是手动捕获工作线程上的各种异常,记录它们的详细信息,然后在主线...
    编程 发布于2024-11-06
  • 如何使用 3D CSS 变换修复 Firefox 中的锯齿状边缘?
    如何使用 3D CSS 变换修复 Firefox 中的锯齿状边缘?
    使用 3D CSS 变换时 Firefox 中的锯齿状边缘与 Chrome 中使用 CSS 变换时的锯齿状边缘问题类似,Firefox 在 3D 变换中也出现了这个问题。背面可见性作为 Chrome 中的潜在解决方案,在 Firefox 中被证明无效。解决方法:要在 Firefox 中缓解此问题,您...
    编程 发布于2024-11-06
  • 为什么 PHP 的 mail() 函数给电子邮件发送带来挑战?
    为什么 PHP 的 mail() 函数给电子邮件发送带来挑战?
    为什么 PHP 的 mail() 函数达不到要求:限制和陷阱虽然 PHP 提供了 mail() 函数用于发送电子邮件,但它却失败了与专用库或扩展相比较短。以下是与使用 mail() 相关的缺点和限制的全面检查:格式问题:mail() 可能会遇到以下问题:标题和内容格式,尤其是操作系统之间的换行符差异...
    编程 发布于2024-11-06
  • 使用 npyConverter 简化 NumPy 文件转换
    使用 npyConverter 简化 NumPy 文件转换
    如果您使用 NumPy 的 .npy 文件并需要将其转换为 .mat (MATLAB) 或 .csv 格式,npyConverter 就是适合您的工具!这个简单的基于 GUI 的工具通过干净且用户友好的界面提供 .npy 文件的批量转换。 主要特点 批量转换:将目录下所有.npy文件...
    编程 发布于2024-11-06
  • 如何禁用特定线路的 Eslint 规则?
    如何禁用特定线路的 Eslint 规则?
    禁用特定行的 Eslint 规则在 JSHint 中,可以使用语法禁用特定行的 linting 规则: /* jshint ignore:start */ $scope.someVar = ConstructorFunction(); /* jshint ignore:end */对于 eslint...
    编程 发布于2024-11-06
  • 如何在没有错误的情况下将列表插入 Pandas DataFrame 单元格?
    如何在没有错误的情况下将列表插入 Pandas DataFrame 单元格?
    将列表插入 Pandas 单元格问题在 Python 中,尝试将列表插入 Pandas DataFrame 的单元格可能会导致错误或意想不到的结果。例如,当尝试将列表插入 DataFrame df 的单元格 1B 时:df = pd.DataFrame({'A': [12, 23], 'B': [n...
    编程 发布于2024-11-06
  • Matplotlib 中的“plt.plot”、“ax.plot”和“figure.add_subplot”之间的主要区别是什么?
    Matplotlib 中的“plt.plot”、“ax.plot”和“figure.add_subplot”之间的主要区别是什么?
    Matplotlib 中绘图、轴和图形之间的差异Matplotlib 是一个用于创建可视化的面向对象的 Python 库。它使用三个主要对象:图形、轴和绘图。图形图形表示将在其中显示可视化的整个画布或窗口。它定义画布的整体大小和布局,包括边距、背景颜色和任何其他全局属性。轴轴表示图中绘制数据的特定区...
    编程 发布于2024-11-06
  • FireDucks:以零学习成本获得超越 pandas 的性能!
    FireDucks:以零学习成本获得超越 pandas 的性能!
    Pandas 是最受欢迎的库之一,当我在寻找一种更简单的方法来加速其性能时,我发现了 FireDucks 并对它产生了兴趣! 与 pandas 的比较:为什么选择 FireDucks? Pandas 程序可能会遇到严重的性能问题,具体取决于其编写方式。然而,作为一名数据科学家,我想花...
    编程 发布于2024-11-06
  • CSS 网格:嵌套网格布局
    CSS 网格:嵌套网格布局
    介绍 CSS Grid 是一种布局系统,因其在创建多列布局方面的灵活性和效率而迅速受到 Web 开发人员的欢迎。它最有用的功能之一是能够创建嵌套网格布局。嵌套网格可以在设计复杂网页时提供更多控制和精确度。在本文中,我们将探讨在 CSS Grid 中使用嵌套网格布局的优点、缺点和主要...
    编程 发布于2024-11-06
  • 适用于 Java 的 Jupyter 笔记本
    适用于 Java 的 Jupyter 笔记本
    Jupyter Notebook 的强大 Jupyter Notebooks 是一个出色的工具,最初是为了帮助数据科学家和工程师使用 python 编程语言简化数据处理工作而开发的。事实上,笔记本的交互性使其非常适合快速查看代码结果,而无需搭建开发环境、编译、打包等。此功能对于数据...
    编程 发布于2024-11-06
  • 如何在 PyQt 中的主窗口和线程之间共享数据:直接引用与信号和槽?
    如何在 PyQt 中的主窗口和线程之间共享数据:直接引用与信号和槽?
    PyQt 中主窗口和线程之间共享数据多线程应用程序通常需要在主窗口线程和工作线程之间共享数据。为了确保线程安全和正确的通信,PyQt 提供了几种实用的方法。选项 1:直接引用主窗口在此方法中,对主窗口的引用窗口被传递给线程。然后线程可以直接访问主窗口中的数据,例如 spinbox 的值。class ...
    编程 发布于2024-11-06
  • 对于专业开发人员来说最有用的 VS Code 快捷方式?
    对于专业开发人员来说最有用的 VS Code 快捷方式?
    VS Code 中 20 个最有用的快捷键 一般导航 命令面板:访问 VS Code 中的所有可用命令。 Ctrl Shift P (Windows/Linux) 或 Cmd Shift P (macOS) 快速打开:按名称快速打开文件。 Ctrl P (Windows/Linux) 或 Cmd ...
    编程 发布于2024-11-06
  • 何时使用“composer update”与“composer install”?
    何时使用“composer update”与“composer install”?
    探索composer update和composer install之间的区别Composer是一个流行的PHP依赖管理器,提供两个关键命令:composer update和composer install。虽然它们具有管理依赖关系的共同目标,但它们具有不同的目的并以不同的方式运行。Composer...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3