给定类型(types.GenericAlias)递归创建默认值

问题描述 投票:0回答:1

给定一个类型

t
(最初来自函数注释),我需要创建该类型的默认值。通常,
t()
就能做到这一点,并且适用于多种类型,包括
bool
int
等基本类型。但是,
tuple[bool, int]()
返回一个空元组,这不是正确的默认值。对于更复杂的类型,例如
tuple[bool, list[int]]
,它可能会变得稍微棘手。

我看到

tuple[bool, int].__args__
返回
(<class 'bool'>, <class 'int'>)
,这对于编写实现此功能的递归函数可能很有用,但我仍然遇到问题。

是否有现有函数可以执行此操作并返回默认值?如果没有,我将如何编写此代码以适用于所有标准类型?

我使用的是Python 3.11。

python python-typing
1个回答
0
投票

由于

tuple
是唯一一个标准类型,其中默认值不应该只是类型的实例化,因此您可以简单地在函数中对其进行特例,以递归方式为给定类型创建默认值:

from types import GenericAlias

def get_default_value(typ):
    if isinstance(typ, GenericAlias) and issubclass(typ.__origin__, tuple):
        return typ(map(get_default_value, typ.__args__))
    return typ()

这样:

print(get_default_value(tuple[bool, list[int]]))

输出:

(False, [])

演示:https://ideone.com/wlb6TL

© www.soinside.com 2019 - 2024. All rights reserved.