问题:创建嵌套数据类时出现的问题

huangapple go评论101阅读模式
英文:

Issue with creation of nested data classes

问题

以下是要翻译的代码部分:

  1. 我正在尝试创建嵌套数据类
  2. ```python
  3. from dataclasses import dataclass, field
  4. import datetime
  5. from typing import List
  6. @dataclass
  7. class LineItem:
  8. displayName: str
  9. compareAtPrice: float
  10. discountedPrice: float
  11. pricing: str = field(init=False)
  12. def __post_init__(self):
  13. self.pricing = (
  14. "regular" if self.compareAtPrice == self.discountedPrice else "on sale"
  15. )
  16. @dataclass
  17. class Order:
  18. createdAt: datetime
  19. lineItems: List[LineItem]
  20. def __post_init__(self):
  21. for l in self.lineItems:
  22. LineItem(**l)
  23. data = {
  24. "createdAt": datetime.datetime.now(),
  25. "lineItems": [
  26. {
  27. "displayName": "lineitem 1",
  28. "compareAtPrice": 28.1,
  29. "discountedPrice": 28.1,
  30. },
  31. {
  32. "displayName": "lineitem 2",
  33. "compareAtPrice": 88.1,
  34. "discountedPrice": 78.1,
  35. },
  36. ],
  37. }
  38. print(Order(**data))

输出缺少应由class LineItem中的__post_init__填充的pricing字段:

  1. Order(createdAt=datetime.datetime(2023, 3, 9, 17, 18, 40, 136535), lineItems=[{'displayName': 'lineitem 1', 'compareAtPrice': 28.1, 'discountedPrice': 28.1}, {'displayName': 'lineitem 2', 'compareAtPrice': 88.1, 'discountedPrice': 78.1}])

我在这里做错了什么?

  1. <details>
  2. <summary>英文:</summary>
  3. I&#39;m trying to create nested data classes:

from dataclasses import dataclass, field
import datetime
from typing import List

@dataclass
class LineItem:
displayName: str
compareAtPrice: float
discountedPrice: float
pricing: str = field(init=False)

  1. def __post_init__(self):
  2. self.pricing = (
  3. &quot;regular&quot; if self.compareAtPrice == self.discountedPrice else &quot;on sale&quot;
  4. )

@dataclass
class Order:
createdAt: datetime
lineItems: List[LineItem]

  1. def __post_init__(self):
  2. for l in self.lineItems:
  3. LineItem(**l)

data = {
"createdAt": datetime.datetime.now(),
"lineItems": [
{
"displayName": "lineitem 1",
"compareAtPrice": 28.1,
"discountedPrice": 28.1,
},
{
"displayName": "lineitem 2",
"compareAtPrice": 88.1,
"discountedPrice": 78.1,
},
],
}

print(Order(**data))

  1. The output is missing the `pricing` field which should be populated by `__post_init__` in `class LineItem` :

Order(createdAt=datetime.datetime(2023, 3, 9, 17, 18, 40, 136535), lineItems=[{'displayName': 'lineitem 1', 'compareAtPrice': 28.1, 'discountedPrice': 28.1}, {'displayName': 'lineitem 2', 'compareAtPrice': 88.1, 'discountedPrice': 78.1}])

  1. What am I doing wrong here?
  2. </details>
  3. # 答案1
  4. **得分**: 4
  5. 你可以在你的 **Order** 类中做一个小改变,如下所示,
  6. ```python
  7. @dataclass
  8. class Order:
  9. createdAt: datetime
  10. lineItems: List[LineItem>
  11. def __post_init__(self):
  12. self.lineItems = [LineItem(**l) for l in self.lineItems]
英文:

You can do a small change like this in your Order class,

  1. @dataclass
  2. class Order:
  3. createdAt: datetime
  4. lineItems: List[LineItem]
  5. def __post_init__(self):
  6. self.lineItems = [LineItem(**l) for l in self.lineItems]

huangapple
  • 本文由 发表于 2023年3月10日 00:26:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/75687409.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定