[英]In Python (and attrs), can I export a field to yaml using a different name?
我想修改一個字段名,但只有在導出到 yaml 時。 例如:
import attrs
import yaml
from attr import fields, field
from attrs import define
@define
class Task:
id: int
@define
class Data:
all_tasks: List[Task]
x: int = field(default=5)
if __name__ == '__main__':
list_of_tasks = [Task(1), Task(2), Task(3),]
d = Data(list_of_tasks, 10)
print(yaml.dump(attrs.asdict(d)))
運行這段代碼我得到
all_tasks:
- id: 1
- id: 2
- id: 3
x: 10
我想將代碼中的變量名稱保留為all_tasks
,但在 yaml 中將其更改為tasks
。 我的通用答案更可取,因為有幾個字段需要更改。
根本問題:
潛在的問題是我有一個“任務列表”並且將該變量稱為“任務”使其非常類似於單個“任務”,因此我通常將其重命名為其他名稱。 也就是說,當從 YAML 導出/導入時,只有“任務”看起來好多了(出於配置目的和非代碼意識的人。
如果有沒有 attrs 的好方法,我也會接受。
PyYAML 不支持這種開箱即用的功能,但您可以編寫自定義表示來執行此操作。 這是一個裝飾器的例子,你可以用它來更改字段名稱,沒有attrs
因為我不知道它:
import yaml, sys
class yamlTranslate(object):
def __init__(self, **mappings):
self.mappings = mappings
def __call__(self, cls):
def to_yaml(dumper, data):
raw = vars(data)
for key, value in self.mappings.items():
subject = raw[key]
del(raw[key])
raw[value] = subject
return dumper.represent_mapping("tag:yaml.org,2002:map", raw)
yaml.SafeDumper.add_representer(cls, to_yaml)
return cls
@yamlTranslate()
class Task:
def __init__(self, id):
self.id = id
@yamlTranslate(all_tasks = "tasks")
class Data:
def __init__(self, all_tasks, x):
self.all_tasks = all_tasks
self.x = x
list_of_tasks = [Task(1), Task(2), Task(3),]
d = Data(list_of_tasks, 10)
yaml.safe_dump(d, sys.stdout)
輸出:
tasks:
- id: 1
- id: 2
- id: 3
x: 10
我使用非遞歸的vars
,所以Task
類還需要@yamlTranslate()
來為其定義一個代表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.