2016-04-28 85 views
2

我的HTTP客户端使用Python 请求库来访问由CloudFlare代理的API。客户端将数字响应状态代码转换为枚举实例HTTPStatus。简化...如何在Python 3.5中将自定义代码添加到HTTPStatus?

import requests 
from http import HTTPStatus 

url = ... 
response = requests.get(url) 
status = HTTPStatus(response.status_code) 

的CloudFlare的代理服务可以返回一些非官方的5xx HTTP状态代码:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#CloudFlare。这些因素导致HTTPStatus增加ValueError,因为诸如522(连接超时)之类的代码不是Python lib/http/__init__.py中定义的HTTPStatus枚举的成员。

如何将非官方CloudFlare状态码添加到HTTPStatus枚举中?或者,如何将HTTPStatus enum成员加载到其他枚举以及非官方CloudFlare状态代码中?

Python 3.5 Enum文档https://docs.python.org/3/library/enum.html描述了迄今为止阻碍了我的限制。

第8.13.9节:只有在 枚举未定义任何成员时才允许子类化枚举。

第8.13.14.2节:关于Enum成员最有趣的事情是 他们是单身人士。 EnumMeta创建它们全部,而它是 创建Enum类本身,然后将自定义__new__() 适当的位置以确保没有新的实例通过返回 只有现有的成员实例。

+1

你绝对需要使用HTTPStatus吗?它不可变的事实使得几乎不可能改变。您可以创建一个字典映射状态代码到statii。 –

回答

0

aenum library 具有extend_enum功能,其能够增加新的部件到现有的枚举。

实例:

import aenum 
from http import HTTPStatus 

aenum.extend_enum(HTTPStatus, 'BAD_SPAM', 513, 'Too greasy') 
aenum.extend_enum(HTTPStatus, 'BAD_EGGS', 514, 'Too green') 

aenum library距离enum34 backport和Python的3.4 Enum数据类型的作者/合着者。

+0

@joelsphrentz:感谢编辑,我修正了引用。 –

相关问题