8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

修改Python中嵌套对象的最佳实践

CPlus 7月前

139 0
我正在使用Beanie ODM与MongoDB进行互动的Python项目,并且遇到了需要修改嵌套对象的情况。 具体来说,我正在处理一个用户对象,

我正在使用Beanie ODM与MongoDB进行交互的Python项目,并且遇到了需要修改嵌套对象的情况。

具体来说,我正在处理包含嵌套作业对象的用户对象(除其他属性)。 这是我正在使用的模型的简化版本:
from beanie import Document
from pydantic import BaseModel

class Job(BaseModel):
    title: str
    salary: int

class User(Document):
    name: str
    age: int
    job: Job

从数据库中检索 用户 实例后,我有几个功能可以修改 用户 及其嵌套 job 对象。

例如,更新用户的职位和薪水。 现在,这是我有点不确定的地方,以下示例:
from typing import Union
from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient
import asyncio

async def fetch_user_by_name(name: str) -> Union[User, None]:
    user = await User.find_one(User.name == name)
    return user

def update_user_name(user: User, new_name: str) -> None:
    user.name = new_name

def update_user_job(user: User, new_title: str, new_salary: int) -> None:
    user.job.title = new_title
    user.job.salary = new_salary

async def main():
    # Initialize Beanie with database connection and document models
    client = AsyncIOMotorClient("mongodb://localhost:27017")
    await init_beanie(database=client.db_name, document_models=[User])

    # Example usage
    user = await fetch_user_by_name("Alice")
    if user:
        update_user_name(user, "Alice Updated")
        update_user_job(user, "Senior Developer", 90000)
        await user.save()
        print("User and job updated successfully.")
    else:
        print("User not found.")

这是一个非常基本的示例,真实的示例更为复杂,并使用更多的方法来基于依赖关系以及所有这些操作。

所以,这是我不确定的地方:我知道修改对象可能会导致意外行为,尤其是在较大的代码库或多线程环境中。

但是,由于Beanie返回我操纵的对象,因此我正在考虑处理此类修改的最佳方法。

问题:

  • 用Beanie ODM检索它们后,修改这些嵌套对象是否不良习惯?

我担心潜在的副作用或对代码可维护性的影响。
  • 在进行修改之前,最好创建对象的深度副本?

  • 这似乎可以避免意外的副作用,但是我担心性能的影响,尤其是在更复杂或更深的嵌套物体中。 我也可以将对象作为参数,对其进行修改并返回,但是已经对其进行了修改,因此返回该对象是没有意义的。

    什么将被认为是更好的练习,为什么?

    帖子版权声明 1、本帖标题: 修改Python中嵌套对象的最佳实践
        本站网址:http://xjnalaquan.com/
    2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
    3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
    4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
    5、站长邮箱:yeweds@126.com 除非注明,本帖由CPlus在本站《python》版块原创发布, 转载请注明出处!
    最新回复 (0)
    • 第一个假设是由我的数据设计的,第二个假设也是我想要的。
    返回
    作者最近主题: