是否可以在YAML中进行字符串替换?

科里

有没有一种方法可以替代YAML中的字符串。例如,我想定义sub一次并在整个YAML文件中使用它。

sub: ['a', 'b', 'c']
command:
    params:
        cmd1:
            type: string
            enum :   # Get the list defined in 'sub'
            description: Exclude commands from the test list.
        cmd2:
            type: string
            enum:   # Get the list defined in 'sub'
安通

您不能真正在YAML中替换字符串值,就像用另一个子字符串¹替换某个字符串的子字符串一样。但是,YAML确实可以用标记节点(在您的情况下,列表['a','b','c'])并将其用作别名节点

锚采用以下形式&some_id,并在由*some_id(而不是节点)指定节点和别名节点之前插入

这与在字符串级别进行替换不同,因为在解析YAML文件期间可以保留引用。就像在Python中为集合类型上的所有锚点加载YAML一样(即在标量上使用锚点时不这样):

import sys
import ruamel.yaml as yaml

yaml_str = """\
sub: &sub0 [a, b, c]
command:
    params:
        cmd1:
            type: string
            # Get the list defined in 'sub'
            enum : *sub0
            description: Exclude commands from the test list.
        cmd2:
            type: string
            # Get the list defined in 'sub'
            enum: *sub0
"""

data1 = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)

# the loaded elements point to the same list
assert data1['sub'] is data1['command']['params']['cmd1']['enum']

# change in cmd2
data1['command']['params']['cmd2']['enum'][3] = 'X'


yaml.dump(data1, sys.stdout, Dumper=yaml.RoundTripDumper, indent=4)

这将输出:

sub: &sub0 [a, X, c]
command:
    params:
        cmd1:
            type: string
            # Get the list defined in 'sub'
            enum: *sub0
            description: Exclude commands from the test list.
        cmd2:
            type: string
            # Get the list defined in 'sub'
            enum: *sub0

请注意,原始锚点名称保留在ruamel.yaml中

如果您不希望在输出中使用锚点和别名,则可以重写的子类中ignore_aliases方法(该方法带有两个参数,但使用时不必知道这一点):RoundTripRepresenterRoundTripDumperlambda *args: ....

dumper = yaml.RoundTripDumper
dumper.ignore_aliases = lambda *args : True
yaml.dump(data1, sys.stdout, Dumper=dumper, indent=4)

这使:

sub: [a, X, c]
command:
    params:
        cmd1:
            type: string
            # Get the list defined in 'sub'
            enum: [a, X, c]
            description: Exclude commands from the test list.
        cmd2:
            type: string
            # Get the list defined in 'sub'
            enum: [a, X, c]

通过重新读取在忽略别名的情况下重新读取的内容,可以使用此技巧来读取YAML文件,就像您已经完成了字符串替换一样:

data2 = yaml.load(yaml.dump(yaml.load(yaml_str, Loader=yaml.RoundTripLoader),
                    Dumper=dumper, indent=4), Loader=yaml.RoundTripLoader)

# these are lists with the same value
assert data2['sub'] == data2['command']['params']['cmd1']['enum']
# but the loaded elements do not point to the same list
assert data2['sub'] is not data2['command']['params']['cmd1']['enum']

data2['command']['params']['cmd2']['enum'][5] = 'X'

yaml.dump(data2, sys.stdout, Dumper=yaml.RoundTripDumper, indent=4)

现在只有一个'b'更改为'X'

sub: [a, b, c]
command:
    params:
        cmd1:
            type: string
            # Get the list defined in 'sub'
            enum: [a, b, c]
            description: Exclude commands from the test list.
        cmd2:
            type: string
            # Get the list defined in 'sub'
            enum: [a, X, c]

如上所述,仅当在集合类型上使用锚点/别名时才需要,而在标量上使用它时则不需要。


¹由于YAML可以创建对象,因此,如果创建了这些对象,就有可能影响解析器。这个答案描述了如何做到这一点。
²保留名称最初不可用,但已在ruamel.yaml更新中实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在字符串中进行外壳替换

来自分类Dev

检查字符串是否可以在C中进行突变

来自分类Dev

在Angular 2中,是否可以在字符串中进行Angular绑定

来自分类Dev

在字典中进行格式字符串替换

来自分类Dev

如何在字符串变量 XSLT 中进行替换?

来自分类Dev

与原始字符串进行比较后在Perl中进行字符串替换

来自分类Dev

是否可以用shell字符串进行双替换?

来自分类Dev

是否可以放弃替换字符串顺序?

来自分类Dev

如何在YAML多行字符串中进行Unicode转义?

来自分类Dev

在字符串中进行多个字符串替换时,如何避免使用var

来自分类Dev

在python中进行字符串比较

来自分类Dev

是否可以在mysql查询中对字符串进行jsonify?

来自分类Dev

是否可以对字符串元素列表进行排序?

来自分类Dev

如何在多个查询中进行多个字符串替换?

来自分类Dev

有效地在字符串中进行多次替换

来自分类Dev

如何使用MultiIndex在Python数据框列中进行字符串替换

来自分类Dev

使用Format()在Python中进行动态字符串替换

来自分类Dev

如何在多个查询中进行多个字符串替换?

来自分类Dev

如何在Makefile中使用cat创建的变量中进行字符串替换?

来自分类Dev

SQL:有没有办法在 SQL 中进行批量字符串替换?

来自分类Dev

Ansible:如何迭代多个键/值以在多个文件中进行字符串替换

来自分类Dev

如何在 f# 中进行非标准字符串替换?

来自分类Dev

将字符串文字放入executeQuery中是否易于在JDBC中进行SQL注入?

来自分类Dev

是否可以在来自YAML文件的字符串中包含特殊字符?

来自分类Dev

是否可以在 PhpStorm 或 Notepad++ 中进行 2 向替换?

来自分类Dev

使用sed进行字符串替换

来自分类Dev

使用sed进行字符串替换

来自分类Dev

用替换字符串进行迭代

来自分类Dev

是否可以通过Spring DSL替换字符串中的双引号“字符?

Related 相关文章

  1. 1

    在字符串中进行外壳替换

  2. 2

    检查字符串是否可以在C中进行突变

  3. 3

    在Angular 2中,是否可以在字符串中进行Angular绑定

  4. 4

    在字典中进行格式字符串替换

  5. 5

    如何在字符串变量 XSLT 中进行替换?

  6. 6

    与原始字符串进行比较后在Perl中进行字符串替换

  7. 7

    是否可以用shell字符串进行双替换?

  8. 8

    是否可以放弃替换字符串顺序?

  9. 9

    如何在YAML多行字符串中进行Unicode转义?

  10. 10

    在字符串中进行多个字符串替换时,如何避免使用var

  11. 11

    在python中进行字符串比较

  12. 12

    是否可以在mysql查询中对字符串进行jsonify?

  13. 13

    是否可以对字符串元素列表进行排序?

  14. 14

    如何在多个查询中进行多个字符串替换?

  15. 15

    有效地在字符串中进行多次替换

  16. 16

    如何使用MultiIndex在Python数据框列中进行字符串替换

  17. 17

    使用Format()在Python中进行动态字符串替换

  18. 18

    如何在多个查询中进行多个字符串替换?

  19. 19

    如何在Makefile中使用cat创建的变量中进行字符串替换?

  20. 20

    SQL:有没有办法在 SQL 中进行批量字符串替换?

  21. 21

    Ansible:如何迭代多个键/值以在多个文件中进行字符串替换

  22. 22

    如何在 f# 中进行非标准字符串替换?

  23. 23

    将字符串文字放入executeQuery中是否易于在JDBC中进行SQL注入?

  24. 24

    是否可以在来自YAML文件的字符串中包含特殊字符?

  25. 25

    是否可以在 PhpStorm 或 Notepad++ 中进行 2 向替换?

  26. 26

    使用sed进行字符串替换

  27. 27

    使用sed进行字符串替换

  28. 28

    用替换字符串进行迭代

  29. 29

    是否可以通过Spring DSL替换字符串中的双引号“字符?

热门标签

归档