【问题标题】:Customise dataclass asdict keynames自定义数据类 asdict 键名
【发布时间】:2020-11-28 17:20:48
【问题描述】:

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

字典输出示例:

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

显然我不能拥有数据类

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

我需要它表示为

@dataclass
class Foo:
    one: str
    ...

例如,但我希望 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'

工作

【问题讨论】:

    标签: python python-3.x python-dataclasses


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2019-11-12
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多