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

Python中如何从变量为枚举赋值?改用session调用的实现求助

基于HttpPooling会话的HTTP方法枚举实现

初始实现

最初的代码直接将requests的请求方法赋值给枚举成员,实现了通过枚举调用请求的能力:

class HttpMethod(enum.Enum):
    GET = requests.get
    POST = requests.post
    # 其他HTTP方法...

    def __call__(self, *args, **kwargs):
        return self.value(*args, **kwargs)

需求与现有约束

现在需要将请求方法替换为HttpPooling类实例中session对象的对应方法(如session.get),且不能将session设为模块全局变量。当前HttpPooling的实现如下:

class HttpPooling:
    def __init__(self, **kwargs):
        self.session = requests.Session()
        retries = Retry(**kwargs)
        self.session.mount("http://", HTTPAdapter(max_retries=retries))
        self.session.mount("https://", HTTPAdapter(max_retries=retries))

曾尝试直接在枚举内初始化HttpPooling并赋值方法,但无法正常工作,期望实现类似如下的简洁效果:

class HttpMethod(enum.Enum):
    pool = HttpPooling()
    GET = pool.session.get
    POST = pool.session.post

两年后可行解决方案

以下是总结出的实现方案,可直接适配需求调整:

from enum import IntEnum
from typing import Callable, Any
import requests


class Method(IntEnum):
    """该枚举代表API支持的HTTP方法"""

    GET, POST, PUT, PATCH, DELETE, HEAD = range(6)

    @property
    def func(self) -> Callable[..., Any]:
        """根据枚举名称获取对应的请求方法

        返回:
            可调用函数: 如果存在对应属性则返回方法,否则抛出错误
        """
        # 适配HttpPooling需求时,替换为getattr(self._pool.session, self.name.lower())即可
        return getattr(requests, self.name.lower())

    def __call__(self, *args, **kwargs) -> requests.Response:
        """调用枚举关联的请求方法

        返回:
            requests.Response: 请求方法的执行结果
        """
        return self.func(*args, **kwargs)

    def __repr__(self) -> str:
        """返回枚举的表示形式"""
        return self.func.__repr__()

    def __str__(self) -> str:
        """返回枚举的字符串表示"""
        return self.func.__str__()

适配HttpPooling的调整示例

如果要满足使用HttpPooling会话的需求,只需修改枚举内的func属性,并添加HttpPooling实例:

class Method(IntEnum):
    """该枚举代表API支持的HTTP方法"""

    GET, POST, PUT, PATCH, DELETE, HEAD = range(6)
    # 初始化HttpPooling实例(也可通过外部传入实现灵活配置)
    _pool = HttpPooling()

    @property
    def func(self) -> Callable[..., Any]:
        """根据枚举名称获取session对应的请求方法"""
        return getattr(self._pool.session, self.name.lower())

    # __call__、__repr__、__str__方法与上述一致

内容的提问来源于stack exchange,提问作者Amaury Le Roux Dupeyron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:35:31