目前,我正在与 YANG 作为(遗留)Python 项目的一部分一起工作。
我有点卡在定义模式的任务上,然后用它来验证数据,组织成一个 Python 字典。如果可能的话,我会“希望”保留当前的结构,因为很多代码库都在使用这些数据。
“未更改”的数据:
"namespace": { # Mandatory
"management": { # Optional
"interfaces": { # Mandatory
"m0": { # Optional
"leaf1": "..."
}
}
},
"benchmark": { # Optional
"interfaces": { # Mandatory
"b0": { # Optional
"leaf1": "...",
"leaf2": "..."
},
"b1": { # Optional
"leaf1": "...",
"leaf2": "..."
}
}
}
}
我的问题是标记为“可选”的所有内容(在示例中)都将被建模为容器,但根据RFC6020似乎不能将它们定义为可选(即:强制 false;) 。
因此,我定义了一个使用列表的模型。这意味着 Python Dict 的某些节点(管理、基准、m0、b0、b1)现在是列表元素,无法以当前方式访问,例如:data['namespace']['management']...
修改后的示例如下所示:
"namespace": [
{
"desc": "management",
"interfaces": [
{
"leaf1": "..."
}
]
},
{
"desc": "benchmark",
"interfaces": [
{
"leaf1": "...",
"leaf2": "..."
},
{
"leaf1": "...",
"leaf2": "..."
}
]
}
]
YANG 模型的描述(摘自我当前的片段):
list namespace {
description "Namespace definitions.";
key desc;
leaf desc { type string; }
uses leaf-definitions;
list interfaces {
key leaf1;
uses leaf-definitions;
}
}
验证成功,数据(本身)的转换没有问题,但是导致一大堆破代码。
这导致了我的问题:
- 我是对的 - YANG 中的容器总是强制性的吗?
- 是否有另一种方法来模拟这种情况?(没有打破“太多”)
我非常感谢您的意见,因为我对 YANG 还很陌生!