我可以在不将YAML锚分配给密钥的情况下分配它吗



我想在YAML中有效地定义一个变量,然后在多个位置将其用作值:

myvar_foo: &myvar_bar 1000
my_values:
one: *myvar_bar
two: *myvar_bar

我觉得我需要把myvar_foo放在里面很不雅。我从不使用它;我只使用myvar_bar

有什么办法做到这一点吗?我能想到的最好的办法是使用一个明显的一次性名称,比如

_: &myvar_bar 1000
my_values:
one: *myvar_bar
two: *myvar_bar

或者在我第一次使用时分配锚点

my_values:
one: &myvar_bar 1000
two: *myvar_bar

YAML中没有变量。您不能在YAML中分配任何内容。您正在尝试将编程语言范例应用于数据序列化语言。

YAML文档内容的语义是一个弱连通图。任何值都是该图中的一个节点。锚点只是一个节点的名称,以便以后可以引用。这意味着:

  • 您的值(1000(是一个节点,因为所有内容都存储在节点中
  • 由于图是弱连接的,因此必须有从根节点到您的值的路径
  • 因此,不能将原始值放置在文档内容之外

您提到的第二个选项:

my_values:
one: &myvar_bar 1000
two: *myvar_bar

是在YAML中实现这一点的自然方式:在第一次出现时,节点的值被定义并使用锚点命名。随后的每个事件都将被序列化为该锚定节点的别名。

当然,仅仅是YAML不是为你想做的事情而设计的这一事实并不会使你的目标无效。如果您想将值定义保留在内容树之外,并控制加载此YAML的代码,您可以执行以下操作:

declare:
- &myvalue_bar 1000
begin:
my_values:
one: *myvar_bar
two: *myvar_bar

然后,在加载时,将root["begin"]中的文档树作为加载值。你甚至可以通过拥有一个类似的标题来实现自动化

%YAML 1.2
--- !vars
declare:
- &myvar_bar 1000
begin:
# snip

然后,您只需要为!vars注册一个构造函数,该构造函数返回begin的内部值。

最新更新