假设我有一个带有可选字段的PUDINIC模型:

class MyModel(BaseModel):
    field_1: str | None

我通过使用parse_obj()传递一个dict来实例化

现在,如果没有设置任何字段成员,我希望PYDINIC对象为None.

示例:

data_a = {
    'field_1': 'value_1'
}
obj_a = MyModel.parse_obj(data_a)
print(type(obj_a))  # <class 'MyModel'>
  

data_b = {
    'foo': 'bar'
}
obj_b = MyModel.parse_obj(data_b)
print(type(obj_b))  # I would like this to be NoneType !

当然,我知道我可以在进行任何实例化之前判断输入数据中是否存在这些字段,但我希望避免这样做,并以一种更通用的方式来实现(想象一下,有许多不同的模型具有不同的字段).

推荐答案

你可以使用all()和一个列表理解:

if all(val is None for val in dict(obj_b).values()):
    obj_b = None

或者,如果没有任何字段故意设置为None,您可以判断是否有任何字段已设置:

if not obj_b.__fields_set__:
    obj_b = None

这两个文件都可以压缩:

# First
obj_b = None if all(val is None for val in dict(obj_b).values()) else obj_b
# Second
obj_b = obj_b if obj_b.__fields_set__ else None

下面是一个自动执行此操作的基类:

class NoneCheckModel(BaseModel):
    """Model with None checking"""
    @classmethod
    def parse_obj(*args, **kwargs):
        result = super().parse_obj(*args, **kwargs)
        return None if all(val is None for val in dict(result).values()) else result

Python相关问答推荐

在IIS中运行的FastAPI-获取权限错误:[Win错误10013]试图以其访问权限禁止的方式访问插槽

Plotly Dash函数来切换图形参数-pPython

使用decorator 重复超载

已安装' owiener ' Python模块,但在导入过程中始终没有名为owiener的模块

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

如何计算部分聚合数据的统计数据

pyautogui.locateOnScreen在Linux上的工作方式有所不同

阅读Polars Python中管道的函数定义

是pandas.DataFrame使用方法查询后仍然排序吗?

在使用Guouti包的Python中运行MPP模型时内存不足

使文本输入中的文本与标签中的文本相同

jit JAX函数中的迭代器

从webhook中的短代码(而不是电话号码)接收Twilio消息

时间序列分解

未删除映射表的行

如何在python polars中停止otherate(),当使用when()表达式时?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

OR—Tools中CP—SAT求解器的IntVar设置值

在代码执行后关闭ChromeDriver窗口

从旋转的DF查询非NaN值