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

