如何在PyYaml中使用chomping指示符|-添加字面字符串模式

4

我正在尝试从Python对象生成一个YAML文件,其中我有一些字面字符串属性pattern = "^[0-9]+$",要添加到同名节点pattern作为文件夹块。

代码

到目前为止,我已经进展到以下代码:

import yaml
class MyDumper(yaml.Dumper):
    def increase_indent(self, flow=False, indentless=False):
        return super(MyDumper, self).increase_indent(flow, False)


source = {'row_filters':{'NONE':{'filter_sql_expr': True}},
          'rule_dimensions': ['completeness','conformance'],
          'rules': {'VALID_CUSTOMER_ID': {'rule_type': 'REGEX', 'dimension': 'accuracy', 'params': {'pattern': "^[0-9]+$"}}}}    

print(yaml.dump(source, Dumper=MyDumper, default_flow_style=False,sort_keys=False,indent=2,allow_unicode=True))

实际的YAML输出

row_filters:
  NONE:
    filter_sql_expr: True
rule_dimensions:
  - completeness
  - conformance
rules:
  VALID_CUSTOMER_ID:
    rule_type: REGEX
    dimension: accuracy
    params:
      pattern: ^[0-9]+$

期望的 YAML 输出

row_filters:
 NONE:
   filter_sql_expr: |-
      True
rule_dimensions:
  - completeness
  - conformance
rules:
  VALID_CUSTOMER_ID:
    rule_type: REGEX
    dimension: accuracy
    params:
      pattern: |-
        ^[0-9]+$

招聘

我需要为多行块添加|-,并使用block chomping indicator - 以便将字符串作为块文字添加。

问题

  1. 如何强制使用|-将字符串添加到块样式中?
  2. 如何将该方法添加到我的Dumper类中进行转换?
1个回答

1
您可以使用Representer.add_representer()来显示块文字,更多细节请参见此处
class folded_str(str): pass

class literal_str(str): pass

class literal_unicode(str): pass

def change_style(style, representer):
    def new_representer(dumper, data):
        scalar = representer(dumper, data)
        scalar.style = style
        return scalar
    return new_representer

import yaml
from yaml.representer import SafeRepresenter

yaml.add_representer(literal_str, represent_literal_str)

fse = True
ptrn = "^[0-9]+$"

source = {'row_filters':{'NONE':{'filter_sql_expr': literal_str(fse)}},
          'rule_dimensions': ['completeness','conformance'],
          'rules': {'VALID_CUSTOMER_ID': {'rule_type': 'REGEX', 'dimension': 'accuracy', 'params': {'pattern':literal_str(ptrn)}}}}

print(yaml.dump(source))

输出

row_filters:
  NONE:
    filter_sql_expr: |-
      True
rule_dimensions:
- completeness
- conformance
rules:
  VALID_CUSTOMER_ID:
    dimension: accuracy
    params:
      pattern: |-
        ^[0-9]+$
    rule_type: REGEX

我已经尝试过这个方法,但问题在于源字典是从文件中创建的,当将ptrn更新为literal_str(ptrn)时,该值以字符串格式"literal_str(ptrn)"出现,导致在调用函数literal_str时出现问题。是否有其他方法可以从我的转储器类中调用? - RoxaneFelton
我们可以将这个添加到My Dumper类中吗?虽然您的方法很好,但我正在寻找一种适合我的方案的替代解决方案,因为我必须创建源字典,并且在创建它时,它会将所有值作为字符串,并且literal_str将不会被执行,而会被视为字符串。 - RoxaneFelton
对于那个字符串,你能否使用 eval 方法,例如 eval('literal_str(ptrn)') - Prakash Dahal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接