Python jsons 库与可选 None 值的 dataclass 序列化

-2 投票
1 回答
40 浏览
提问于 2025-04-14 17:07

我注意到我的Python代码打印了一些警告信息。这些警告是来自jsons库,当我尝试进行序列化操作时出现的。

/home/user/project/.venv/lib/python3.11/site-packages/jsons/_common_impl.py:43: UserWarning: Failed to dump attribute "None" of object of type "MyClass2". Reason: 'NoneType' object is not callable. Ignoring the attribute. Use suppress_warning(attribute-not-serialized) or suppress_warnings(True) to turn off this message.
  warnings.warn(msg_, *args, **kwargs)

MyClass2只是我用来找出错误原因的一个类。

class MyClass():

    def __init__(self) -> None:
        self.data = None

@dataclass
class MyClass2():
    data: int|None

my_class = MyClass()
my_class_2 = MyClass2(
    data=None,
)

print(
    jsons.dumps(
        my_class,
        strip_privates=True,
    )
)

print(
    jsons.dumps(
        my_class_2,
        strip_privates=True,
    )
)

MyClass不会产生警告,而MyClass2会。

我知道怎么停止这些警告信息:把类型提示从int|None改成int

@dataclass
class MyClass2():
    data: int     # no `|None` here !

为什么这样做有效呢?

如果我把类型提示从int|None改掉,序列化依然能正常进行,但警告就不会出现了。即使没有None作为类型提示,序列化None也能正常工作。

1 个回答

0

正如其他评论中提到的,这看起来确实是个错误。

作为一个解决办法,我建议把这个值设置为 Optional

from typing import Optional

class MyClass:

    data: Optional[int] = None

撰写回答