簡體   English   中英

YAML 在打印對象時使用 repr/str

[英]YAML to use repr/str when printing an object

我有一本字典,其中鍵是對象。 這些對象可以被認為是元組包裝器,它們確實實現了__hash____repr__

example = {
  Coordinates(0,0): Rome,
  Coordinates(0,1): Zurich
}

我想使用對象的 repr 用yaml打印字典。 這將是所需的輸出:

(0, 0): Rome
(0, 1): Zurich

相反,我得到的是:

? !!python/object:__main__.Coordinates
  x: 0
  y: 0
: Rome
? !!python/object:__main__.Coordinates
  x: 0
  y: 1
: Zurich

我正在通過以下方式進行轉換:

import yaml
print(yaml.dump(example, allow_unicode=True, default_flow_style=False))

到目前為止,我找到的唯一解決方案是自己手動將所有內容強制轉換為str() 有沒有更優雅的解決方案?

假設類型Coordinates存在,這將是設置:

import yaml
from yaml.resolver import BaseResolver

def coord_representer(dumper, data):
  return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG,
      data.__repr__())

yaml.add_representer(Coordinates, coord_representer)

DEFAULT_SCALAR_TAG確保 PyYAML 不會為標量(x, y)轉儲顯式標簽。 您可能希望改用實際的 YAML 序列:

def coord_representer(dumper, data):
  return dumper.represent_sequence(BaseResolver.DEFAULT_SEQUENCE_TAG,
    [data.x, data.y], flow_style=[True, True])

這將產生[x, y] ,一個 YAML 流序列。 問題是這很難再次讀取,因為 PyYAML 默認情況下會從中構造一個列表,該列表不能用作 dict 鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM