python dataclass asdict 忽略没有类型注释的属性
python dataclass asdict ignores attributes without type annotation
Python documentation 解释了如何使用 dataclass
asdict
但它并没有说明没有类型注释的属性将被忽略:
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d = "nope"
c = C(5)
asdict(c)
# this returns
# {'a': 5, 'b': 3, 'c': 'yes'}
# note that d is ignored
如何让 d
属性出现在返回的字典中,而不用自己实现函数?
您可以使用 Any
作为类型注释。
例如:
from typing import Any
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d : Any = "nope"
c = C(5)
asdict(c)
# this returns
# {'a': 5, 'b': 3, 'c': 'yes', 'd': 'nope'}
# Now, d is included as well!
一种俗气且有点不专业的方法是用任何随机字符串值对其进行注释。
因此,例如:
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d: 'help,, i dunno how [a]ny of this w@rks!!' = "nope"
c = C(5)
print(asdict(c))
# this returns
# {'a': 5, 'b': 3, 'c': 'yes', 'd': 'nope'}
经过一番思考,这实际上可以简化为:
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d: ... = "nope"
Python documentation 解释了如何使用 dataclass
asdict
但它并没有说明没有类型注释的属性将被忽略:
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d = "nope"
c = C(5)
asdict(c)
# this returns
# {'a': 5, 'b': 3, 'c': 'yes'}
# note that d is ignored
如何让 d
属性出现在返回的字典中,而不用自己实现函数?
您可以使用 Any
作为类型注释。
例如:
from typing import Any
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d : Any = "nope"
c = C(5)
asdict(c)
# this returns
# {'a': 5, 'b': 3, 'c': 'yes', 'd': 'nope'}
# Now, d is included as well!
一种俗气且有点不专业的方法是用任何随机字符串值对其进行注释。
因此,例如:
from dataclasses import dataclass, asdict
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d: 'help,, i dunno how [a]ny of this w@rks!!' = "nope"
c = C(5)
print(asdict(c))
# this returns
# {'a': 5, 'b': 3, 'c': 'yes', 'd': 'nope'}
经过一番思考,这实际上可以简化为:
@dataclass
class C:
a : int
b : int = 3
c : str = "yes"
d: ... = "nope"