python 找到dict值对应的键,读requests有感

Target:

根据一个字典的值方便的找到键

示例字典:

_codes = {

    # Informational.
    100: ('continue',),
    101: ('switching_protocols',),
    102: ('processing',),
    103: ('checkpoint',),
    122: ('uri_too_long', 'request_uri_too_long'),
    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
    201: ('created',),
    202: ('accepted',),
    203: ('non_authoritative_info', 'non_authoritative_information'),
    204: ('no_content',),
    205: ('reset_content', 'reset'),
    206: ('partial_content', 'partial'),
    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
    208: ('already_reported',),
    226: ('im_used',),

    # Redirection.
    300: ('multiple_choices',),
    301: ('moved_permanently', 'moved', '\\o-'),
    302: ('found',),
    303: ('see_other', 'other'),
    304: ('not_modified',),
    305: ('use_proxy',),
    306: ('switch_proxy',),
    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
    308: ('permanent_redirect',
          'resume_incomplete', 'resume',),  # These 2 to be removed in 3.0

    # Client Error.
    400: ('bad_request', 'bad'),
    401: ('unauthorized',),
    402: ('payment_required', 'payment'),
    403: ('forbidden',),
    404: ('not_found', '-o-'),
    405: ('method_not_allowed', 'not_allowed'),
    406: ('not_acceptable',),
    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
    408: ('request_timeout', 'timeout'),
    409: ('conflict',),
    410: ('gone',),
    411: ('length_required',),
    412: ('precondition_failed', 'precondition'),
    413: ('request_entity_too_large',),
    414: ('request_uri_too_large',),
    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
    417: ('expectation_failed',),
    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
    421: ('misdirected_request',),
    422: ('unprocessable_entity', 'unprocessable'),
    423: ('locked',),
    424: ('failed_dependency', 'dependency'),
    425: ('unordered_collection', 'unordered'),
    426: ('upgrade_required', 'upgrade'),
    428: ('precondition_required', 'precondition'),
    429: ('too_many_requests', 'too_many'),
    431: ('header_fields_too_large', 'fields_too_large'),
    444: ('no_response', 'none'),
    449: ('retry_with', 'retry'),
    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
    499: ('client_closed_request',),

    # Server Error.
    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
    501: ('not_implemented',),
    502: ('bad_gateway',),
    503: ('service_unavailable', 'unavailable'),
    504: ('gateway_timeout',),
    505: ('http_version_not_supported', 'http_version'),
    506: ('variant_also_negotiates',),
    507: ('insufficient_storage',),
    509: ('bandwidth_limit_exceeded', 'bandwidth'),
    510: ('not_extended',),
    511: ('network_authentication_required', 'network_auth', 'network_authentication'),
}

class LookupDict(dict):
    """Dictionary lookup object."""

    def __init__(self, dict_a, name=None):
        self.name = name
        self.adict = dict_a
        super(LookupDict, self).__init__()
        for k, vs in self.adict.items():
            for v in vs:
                setattr(self, v, k)

    def __repr__(self):
        # called when print self
        return '' % (self.name)

    def get(self, key, default=None):
        return self.__dict__.get(key, default)

    def __getitem__(self, key):
        # called when use like lookupdict["somekey"]
        return self.__dict__.get(key, None)
    
    def __getattribute__(self, key):
        # called when use like lookupdict.somekey
        try:
            return super(LookupDict, self).__getattribute__(key)
        except KeyError:
            raise
        except AttributeError:
            raise

look_code = LookupDict(_codes, name="self define name")
# 用字典的方式查找值对应的键名
print look_code["not_found"]
# 用get的方式
print look_code.get("not_extended")
#用属性的方式
print look_code.variant_also_negotiates
print look_code

# output: 404
# output: 510
# output: 506
# output: 

Comments

通过setattr 把原字典的key:value以value:key的形式放到lookupdict的__dict__中,这样就可以直接使用get方法获取值对应的键。

Tips

__getitem__ 函数是 look_code["not_found"] 是这种情况下调用的。
__getattribute__ 是 look_code.not_found 情况下调用的。
__repr__ 是print时候调用的。

Refs

pythonic的字典用法

requests库

你可能感兴趣的:(python 找到dict值对应的键,读requests有感)