You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中指定参数类型为多个类/枚举的可选类型之一?

Python中指定参数为多类型之一的实现方案

Python原生类型提示里没有OneOf语法,要实现参数可以是多个类/枚举之一,有两种标准做法:

1. 基础场景实现

针对你给出的基础示例,用官方推荐的联合类型来实现:

Python 3.9及以下(使用typing.Union)

from typing import Union

class Literal:
    pass

class Expr:
    pass

class MyClass:
    def __init__(self, Type: Union[Literal, Expr]):
        pass

Python 3.10+(简化的|语法)

class Literal:
    pass

class Expr:
    pass

class MyClass:
    def __init__(self, Type: Literal | Expr):
        pass

2. 完整需求场景改造

针对你包含枚举、互相引用类的复杂场景,还要注意语法修正和前向引用问题,改造后的代码如下:

Python 3.9及以下版本

from enum import Enum
from typing import Union, Tuple

PrimitiveType = Enum('PrimitiveType', ['STRING', 'NUMBER'])

# 前向引用:先声明Struct类,解决Array和Struct互相引用的问题
class Struct:
    pass

class Array:
    def __init__(self, Type: Union[Array, Struct, PrimitiveType]):
        self.type = Type

class Pair:
    def __init__(self, Key: str, Type: Union[Array, Struct, PrimitiveType]):
        self.Key = Key
        self.Type = Type

# 补全Struct的构造函数实现(修正原代码的语法错误)
class Struct:
    def __init__(self, pairs: Tuple[Pair, ...]):
        self.pairs = pairs

Python 3.10+版本(更简洁的语法)

from enum import Enum
from typing import Tuple

PrimitiveType = Enum('PrimitiveType', ['STRING', 'NUMBER'])

class Struct:
    pass

class Array:
    def __init__(self, Type: Array | Struct | PrimitiveType):
        self.type = Type

class Pair:
    def __init__(self, Key: str, Type: Array | Struct | PrimitiveType):
        self.Key = Key
        self.Type = Type

class Struct:
    def __init__(self, pairs: Tuple[Pair, ...]):
        self.pairs = pairs

额外提示

  • 类型提示仅用于静态检查(比如IDE、mypy工具),如果需要运行时类型验证,可以在构造函数里添加判断逻辑:
class Array:
    def __init__(self, Type: Array | Struct | PrimitiveType):
        if not isinstance(Type, (Array, Struct, PrimitiveType)):
            raise TypeError("Type参数必须是Array、Struct或PrimitiveType类型")
        self.type = Type
  • 如果你用Python 3.7+,可以在文件开头加上from __future__ import annotations,这样类型提示里可以直接写未定义的类名,不用提前声明空类。

内容的提问来源于stack exchange,提问作者David542

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:56:05