自定义数据类 asdict 键名

the*_*sti 3 python python-3.x python-dataclasses

如何创建具有自定义字典表示形式的数据类?

字典输出示例:

{
    '$1': 'foo',
    '$2': 'bar',
    '$3': 'baz'
}
Run Code Online (Sandbox Code Playgroud)

显然我不能有数据类

@dataclass
class Foo:
    $1: str
    ...
Run Code Online (Sandbox Code Playgroud)

我需要它表示为

@dataclass
class Foo:
    one: str
    ...
Run Code Online (Sandbox Code Playgroud)

例如,但我想dataclasses.asdict(foo)返回“$1”等键名。

如果

x = {
    '$1': 'foo',
    '$2': 'bar',
    '$3': 'baz'
}
foo = Foo(**x)
assert foo.one == 'foo'
assert foo.two == 'bar'
assert foo.three == 'baz'
Run Code Online (Sandbox Code Playgroud)

工作过

che*_*ner 6

您可以简单地传递您自己的dict_factory参数,该参数使用您的映射来构造dict.

@dataclass
class Foo:
    one: str

def factory(kv_pairs):
    m = {
        'one': '$1',
        # etc
    }
    return {m.get(k): v for k, v in kv_pairs}


f = Foo("foo")
assert dataclasses.asdict(f, dict_factory=factory) == {'$1': 'foo'}
Run Code Online (Sandbox Code Playgroud)

为了初始化类,我将使用自定义类方法。

m = {'one': '$1'}
m_inv = {v: k for k, v in m.items()}

@dataclass
class Foo:
    one: str

    @classmethod
    def from_dollar_vars(cls, **kwargs):
        return cls(**{m_inv[k]: v for k, v in kv_pairs})

def factory(kv_pairs):
    return {m[k]: v for k, v in kv_pairs}

x = {'$1': 'foo'}
f = Foo.from_dollar_vars(**x)
assert dataclasses.asdict(f, dict_factory=factory) == x
Run Code Online (Sandbox Code Playgroud)