PyYAML - 将字典转储到文件时跳过某些键

PyYAML - Skipping certain keys when dumping a dict to file

我有一个 YAML 文件,其中包含我的应用程序的配置数据,只要应用程序 运行 出于调试目的,它就会被转储到一个新文件中。不幸的是,YAML 文件中的一些密钥包含敏感数据,需要进行混淆或简单地从转储文件中排除。

示例 YAML 输入文件:

logging_config:
    level: INFO
    file_path: /path/to/log_file.log
database_access:
    table_to_query: customer_table
    database_api_key: XXX-XXX-XXX  # Sensitive data, exclude from archived file

当然有变通办法:

但我希望有一个类似于实现自定义 Loader 的解决方案,只要它出现在 dict 值中就对 !keep_secret 这样的命令做出反应,因为它会使我的配置文件更多可读。

您可以使用自定义代表。这是一个基本示例:

import yaml

class SensitiveText:
  def __init__(self, content):
    self.content = content

  def __repr__(self):
    return self.content

  def __str__(self):
    return self.content

def sensitive_text_remover(dumper, data):
  return dumper.represent_scalar("tag:yaml.org,2002:null", "")

yaml.add_representer(SensitiveText, sensitive_text_remover)

data = {
  "logging_config": {
    "level": "INFO", 
    "file_path": "/path/to/log_file.log"
  },
  "database_access": {
    "table_to_query": "customer_table",
    "database_api_key": SensitiveText("XXX-XXX-XXX")
  }
}

print(yaml.dump(data))

这会打印:

database_access:
  database_api_key:
  table_to_query: customer_table
logging_config:
  file_path: /path/to/log_file.log
  level: INFO

您当然可以为 database_access 使用 class,而不是使用完全删除 database_api_key 的表示器。