2016-04-28 8 views
2

HTTPクライアントはPython リクエストライブラリを使用して、CloudFlareによってプロキシされたAPIにアクセスします。クライアントは数値応答ステータスコードをHTTPStatus enumインスタンスに変換します。 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#CloudFlare:簡体字...Python 3.5でHTTPStatusにカスタムコードを追加するには?

import requests 
from http import HTTPStatus 

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

CloudFlareのプロキシサービスは、いくつかの非公式5xxのHTTPステータスコードを返すことができます。これらは、0122(接続のタイムアウト)などのコードがPythonのlib/http/__init__.pyで定義されているHTTPStatus列挙型のメンバーではないため、HTTPStatusValueErrorになります。

HTTPStatus列挙型のCloudFlareステータスコードを追加するにはどうすればよいですか?または、HTTPStatus列挙型メンバをUnoffical 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 libraryenum34 backportとPython 3.4 Enumデータ型の著者/共著者からのものです。

+0

@joelsphrentz:編集をありがとう、私は引用符を修正しました。 –

関連する問題