2016-04-28 94 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:感謝編輯,我修正了引用。 –

相關問題