将数据类自定义为dict注释记号



如何创建具有自定义dict表示的数据类?

dict输出示例:

{
'$1': 'foo',
'$2': 'bar',
'$3': 'baz'
}

显然我不能拥有数据类

@dataclass
class Foo:
$1: str
...

我需要将其表示为

@dataclass
class Foo:
one: str
...

但是我希望dataclasses.asdict(foo)以"0"返回$1〃;等等密钥名称。

如果

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

工作

您可以简单地传递自己的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'}

为了初始化这个类,我会使用一个自定义的类方法。

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

最新更新