我有这种类型:

class SomeResource:
    id: int
    name: str

我需要这种类型:

class SomeResourceQuery:
    id: Optional[int]
    name: Optional[str]

但我想避免手写.是否可以从SomeResource类型生成此SomeResourceQuery类型?只需将所有类型的字段转换为可选字段.(更新:已经可选的字段可以保持可选-没有嵌套的选项.)

我计划在存储库中使用这SomeResourceQuery,如下所示:

class SomeResourceRepository:
    def get_one_or_none(self, query: SomeResourceQuery) -> Optional[SomeResource]:
        ...

更新:只是为了展示我目前的 idea :

class SomeResource:
    id: int
    name: str


# I don't want to write this by hand:
# class SomeResourceQuery:
#     id: Optional[int]
#     name: Optional[str]

# So what can I do here to make all fields that are not already optional, optional?
SomeResourceQuery = type("SomeResourceQuery", SomeResource) # What to do here?

推荐答案

您可以使用type构造函数构造带有适当注释的新类型.

def construct_query_class(cls: type) -> type:
    annotations = {key: typing.Optional[value]
                    for key, value in cls.__annotations__.items()}

    return dataclasses.dataclass(type(cls.__name__ + 'Query', (),
                                      {'__annotations__': annotations}))

class SomeResource:
    id: int
    name: str

SomeResourceQuery = construct_query_class(SomeResource) # type: typing.Any

Python相关问答推荐

PyTorch卷积自动编码器,输出维度与输入不同

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

替换字符串中的点/逗号,以便可以将其转换为浮动

给定数据点,制定它们的关系

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

Python中的函数中是否有充分的理由接受float而不接受int?

通过交换 node 对链接列表进行 Select 排序

Chatgpt API不断返回错误:404未能从API获取响应

使用Keras的线性回归参数估计

2D空间中的反旋算法

为什么默认情况下所有Python类都是可调用的?

如何创建一个缓冲区周围的一行与manim?

如何设置视频语言时上传到YouTube与Python API客户端

Pandas计数符合某些条件的特定列的数量

不允许访问非IPM文件夹

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

ConversationalRetrivalChain引发键错误

使用Openpyxl从Excel中的折线图更改图表样式

Gekko中基于时间的间隔约束

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?