Geo*_*Geo 46 yaml concatenation
我有这个:
user_dir: /home/user
user_pics: /home/user/pics
Run Code Online (Sandbox Code Playgroud)
我如何使用user_dirfor user_pics?如果我必须指定这样的其他属性,它将不会非常干.
小智 42
您可以使用重复的节点,如下所示:
user_dir: &user_home /home/user
user_pics: *user_home
Run Code Online (Sandbox Code Playgroud)
我不认为你可以连接,所以这不会起作用:
user_dir: &user_home /home/user
user_pics: *user_home/pics
Run Code Online (Sandbox Code Playgroud)
Chr*_*son 31
令人惊讶的是,因为YAML锚点和引用的目的是从YAML数据文件中复制出来,所以没有内置的方法来使用引用连接字符串.从部件构建路径名的用例就是一个很好的例子 - 必须有很多这样的用途.
幸运的是,有一种简单的方法可以通过Python中的自定义标记向YAML添加字符串连接.
import yaml
## define custom tag handler
def join(loader, node):
seq = loader.construct_sequence(node)
return ''.join([str(i) for i in seq])
## register the tag handler
yaml.add_constructor('!join', join)
## using your sample data
yaml.load("""
user_dir: &DIR /home/user
user_pics: !join [*DIR, /pics]
""")
Run Code Online (Sandbox Code Playgroud)
结果如下:
{'user_dir': '/home/user', 'user_pics': '/home/user/pics'}
Run Code Online (Sandbox Code Playgroud)
您可以向数组添加更多项目,例如," "或者"-",如果字符串应该分隔.
小智 9
如果您在PyYaml中使用python,则可以在YAML文件中连接字符串.不幸的是,这只是一个python解决方案,而不是普遍的解决方案:
用os.path.join:
user_dir: &home /home/user
user_pics: !!python/object/apply:os.path.join [*home, pics]
Run Code Online (Sandbox Code Playgroud)
with string.join(为了完整起见 - 这种方法可以灵活地用于多种形式的字符串连接:
user_dir: &home /home/user
user_pics: !!python/object/apply:string.join [[*home, pics], /]
Run Code Online (Sandbox Code Playgroud)
小智 6
我会使用一个数组,然后将该字符串与当前的OS Separator符号连接在一起
像这样:
default: &default_path "you should not use paths in config"
pictures:
- *default_path
- pics
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52664 次 |
| 最近记录: |