簡體   English   中英

在 Python(和 attrs)中,我可以使用不同的名稱將字段導出到 yaml 嗎?

[英]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.

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