如何在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
相关产品推荐
相关产品推荐

