urllib2源码解读三(探索OpenerDirector的add_handler)
这篇讲的是 urllib2 源码中 OpenerDirector 的 add_handler 方法如何实现 handler 的自动分类。文章接续了之前对 build_opener 的探讨,深入到 add_handler 的内部,揭示了它并非简单存储,而是根据每个 handler 实例所具有的方法,进行智能归类。 核心的实现思路非常巧妙:它不依赖显式的类型标识,而是通过解析 handler 方法名的结构来动态分类。具体来说,代码会遍历 handler 的所有方法,检查方法名是否包含特定模式,例如 `http_error_404` 或 `https_open`。它以第一个下划线为界,前半部分是协议(如 http、https),后半部分是条件(如 open、error_301)。根据这些解析出的信息,handler 会被分别注册到 `handle_open`、`handle_error`、`process_request`、`process_response` 这四个核心字典中,使得后续的网络请求调用链能高效、准确地匹配到对应的处理器。 这种基于“约定优于配置”的动态注册机制,让 handler 的功能与协议、状态码紧密绑定,既保持了扩展的灵活性,又确保了内部调用的有序性,是 Python 标准库设计中的一个典型范例。