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