【发布时间】:2020-02-03 09:59:10
【问题描述】:
我目前的情况是,我有一个类 (Item) 和一个子类 (ScoredItem) 以及一个将 Item 变为 ScoredItem 的函数。代码工作正常,但它需要我重新创建现有对象。 Item 可能会获得另一个具有默认值的属性,这会破坏代码。例如,如果Item 有一个属性total_interactions : int = 0,那么插入score_items 的项目列表可能没有total_interactions=0。但是如果score_items没有被调整,那么它就会默默地失败。有没有办法防止这种情况?像scored_item = ScoredItem(score=0.123, **item) 这样的东西?还是item.score = 0.123; scored_item = ScoredItem(item)?
我想过composition vs. inheritance,但是有很好的指标应该是继承。
MVCE
import random
from typing import List
from pydantic import BaseModel
class Item(BaseModel):
item_id: str
title: str
class ScoredItem(Item):
score: float
def get_items() -> List[Item]:
# generate n random items
n = 10
return [Item(item_id=str(i), title="foobar") for i in range(n)]
def score_items(items: List[Item]) -> List[ScoredItem]:
scored_items = []
for item in items:
scored_item = ScoredItem(
# Everything an Item has
item_id=item.item_id, title=item.title,
# Plus the score
score=random.random()
)
return scored_items
items = get_items()
scored_items = score_items(items)
【问题讨论】:
-
为什么不使用
scored_item = ScoredItem(score=0.123, **item.dict())? -
这可能有效:-) - pydantics
.dict()是否保证只有构造函数中的东西/具有每个属性? -
我认为每个属性,仅在一小时前从这篇文章中了解到 pydantic :)
-
它需要参数来更改返回的内容,请参阅文档。
标签: python python-3.x pydantic