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

如何在Python中为介于两数间的变量添加类型提示?

在Python中为区间取值变量添加类型提示

方法1:自定义泛型Interval类型

你可以通过typing.Generic创建带上下限参数的泛型类型,完全匹配你想要的Interval[low, hi]标注格式:

from typing import Generic, TypeVar

Low = TypeVar('Low', bound=float)
Hi = TypeVar('Hi', bound=float)

class Interval(Generic[Low, Hi]):
    pass

# 标注取值在0到1之间的概率变量
def calculate_probability() -> Interval[0.0, 1.0]:
    return 0.7  # 静态类型检查器(如mypy、pyright)会识别该标注

# 变量标注示例
probability: Interval[0.0, 1.0] = 0.5

注意:这种方式仅用于静态类型检查,Python运行时不会自动校验取值是否在区间内。如果需要运行时校验,可以封装带检查逻辑的类:

from typing import Generic, TypeVar, cast

Low = TypeVar('Low', bound=float)
Hi = TypeVar('Hi', bound=float)

class Interval(Generic[Low, Hi]):
    def __init__(self, value: float, low: Low, hi: Hi):
        if not (low <= value <= hi):
            raise ValueError(f"Value {value} must be between {low} and {hi}")
        self.value = value

# 使用示例
probability = Interval(0.7, 0.0, 1.0)
def get_prob() -> Interval[0.0, 1.0]:
    return cast(Interval[0.0, 1.0], Interval(0.6, 0.0, 1.0))

方法2:用NewType做简化标注+运行时校验

如果只针对固定区间(比如0-1),可以用NewType创建专属类型,配合校验函数使用:

from typing import NewType

Probability = NewType('Probability', float)

def validate_probability(value: float) -> Probability:
    if not (0.0 <= value <= 1.0):
        raise ValueError("Probability must be between 0 and 1")
    return Probability(value)

# 使用示例
prob: Probability = validate_probability(0.3)
def compute() -> Probability:
    return validate_probability(0.8)

方法3:利用第三方库做自动校验(如Pydantic)

如果是数据模型或API开发场景,Pydantic的Field可以直接实现区间校验+类型提示:

from pydantic import Field
from pydantic.dataclasses import dataclass

@dataclass
class StatsData:
    probability: float = Field(ge=0.0, le=1.0)  # ge=大于等于,le=小于等于

# 实例化时自动校验
data = StatsData(probability=0.4)
data_invalid = StatsData(probability=1.2)  # 会抛出ValidationError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:35:19