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的逻辑