#独家
为什么 pydantic 中的可变对象没有随着修改变化呢?

2023-05-29 0 3,914
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User(BaseModel):
    friends: List[int] = []


user_1 = User()
user_1.friends.append(1)
print(user_1.friends)

user_2 = User()
print(user_2.friends)

上面的代码,运行后输出如下:

[1]
[]

我有一个疑问,就是 friends 的默认值是一个 [] 空列表,通过前后两次实例化,两个实例对象持有的 friends 为什么指向的不是同一个 list 呢?


如果去掉继承 BaseModel,输出的两个就都是 [1] 了

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User():
    friends: List[int] = []


user_1 = User()
user_1.friends.append(1)
print(user_1.friends)

user_2 = User()
print(user_2.friends)

输出

[1]
[1]

pydantic 的 BaseModel 施加了什么“魔法”?

class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: Optional[datetime] = None
    friends: list[int] = []


external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}

print(repr(user.signup_ts))
#> datetime.datetime(2019, 6, 1, 12, 22)

这个是官方的示例,可以看到在定义了signup_ts为datetime对象之后,传入了’2019-06-01 12:22’这么一个字符串,最后会将这个字符串转为datetime对象

我虽然没有深入pydantic的源码,但大致猜测一下,内部有针对常用的对象做转换。
[]这个也就不奇怪了,可能内部在构造对象的时候有一个copy.deepcopy的逻辑

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 为什么 pydantic 中的可变对象没有随着修改变化呢? https://www.jkxiazai.com/1752.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务