【发布时间】:2021-12-11 03:59:29
【问题描述】:
我无法找到一种简单的方法来从位置给定的字段值(例如在列表而不是字典中)初始化 Pydantic 对象,因此我编写了类方法 positional_fields() 来创建所需的字典一个可迭代的:
from typing import Optional, Iterable, Any, Dict
from pydantic import BaseModel
class StaticRoute(BaseModel):
if_name: str
dest_ip: str
mask: str
gateway_ip: str
distance: Optional[int]
@classmethod
def positional_fields(cls, values: Iterable) -> Dict[str, Any]:
return dict(zip(cls.__fields__, values))
input_lines = """
route ab 10.0.0.0 255.0.0.0 10.220.196.23 1
route gh 10.0.2.61 255.255.255.255 10.220.198.38 1
""".splitlines()
for line in input_lines:
words = line.split()
if words and words[0] == 'route':
sroute = StaticRoute(**StaticRoute.positional_fields(words[1:]))
print(sroute)
if_name='ab' dest_ip='10.0.0.0' mask='255.0.0.0' gateway_ip='10.220.196.23' distance=1
if_name='gh' dest_ip='10.0.2.61' mask='255.255.255.255' gateway_ip='10.220.198.38' distance=1
有没有更直接的方法来实现这一点?
我的方法期望__fields__ 字典按照字段在类中定义的顺序具有键。我不确定这是否得到保证(假设 Python 3.6+)。
【问题讨论】:
-
我已将示例代码更改为包含示例数据的完整工作代码。