You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何向Pydantic的List[PrescribedDrug]类型Cart添加PrescribedDrug对象?

嘿,我来帮你理清这个问题~

你遇到的报错核心原因是:Cart只是一个类型别名,不是实际的列表实例。你写的Cart = List[PrescribedDrug]只是告诉Python"当我提到Cart时,指的是List[PrescribedDrug]这种类型",但它本身并不是一个可以调用方法的列表对象,所以直接去调用Cart.__add__或者尝试修改它,自然会抛出AttributeError


正确的实现方式

要创建一个能添加PrescribedDrug对象的购物车,你需要先创建一个实际的列表实例,可以给它加上Cart的类型标注(这一步是可选的,但能让代码更符合类型规范),之后就可以用列表的标准方法来操作了。

方法1:用append添加单个药品

这是最常用的添加单个元素的方式,直接往列表里追加对象:

from pydantic import BaseModel
from typing import List

class PrescribedDrug(BaseModel):
    ean: str
    repayment: str

Cart = List[PrescribedDrug]

drug1 = PrescribedDrug.parse_obj({ "ean": "5055565722000", "repayment": "" })
drug2 = PrescribedDrug.parse_obj({ "ean": "5055565722001", "repayment": "" })

# 创建空的购物车实例,标注类型为Cart
cart1: Cart = []
cart1.append(drug1)
cart1.append(drug2)

print(cart1)
# 输出结果:
# [PrescribedDrug(ean='5055565722000', repayment=''), PrescribedDrug(ean='5055565722001', repayment='')]

方法2:用+运算符合并列表

如果你想把多个药品组成的列表和现有购物车合并,+运算符会返回一个新的列表:

# 初始购物车已有drug1
cart1: Cart = [drug1]
# 合并包含drug2的列表,得到新购物车
cart2 = cart1 + [drug2]
print(cart2)

方法3:用extend批量添加药品

如果要一次性把多个药品添加到现有购物车(直接修改原列表),用extend方法:

cart1: Cart = []
cart1.extend([drug1, drug2])
print(cart1)

额外优化建议:用类封装购物车(可选)

如果你的购物车后续需要更多自定义逻辑(比如计算总金额、验证药品合法性等),可以把Cart定义成一个继承自BaseModel的类,这样扩展性更强:

from pydantic import BaseModel
from typing import List, Iterator

class PrescribedDrug(BaseModel):
    ean: str
    repayment: str

class Cart(BaseModel):
    items: List[PrescribedDrug] = []

    # 自定义添加药品的方法
    def add_drug(self, drug: PrescribedDrug) -> None:
        self.items.append(drug)

    # 支持迭代,方便遍历购物车
    def __iter__(self) -> Iterator[PrescribedDrug]:
        return iter(self.items)

# 使用示例
cart = Cart()
cart.add_drug(drug1)
cart.add_drug(drug2)

print(cart.items)

这种封装方式更符合面向对象的设计思路,也让购物车的逻辑更清晰易维护。

内容的提问来源于stack exchange,提问作者M. Siwik

火山引擎 最新活动