最近有個項目,須要處理 URL 地方不少,然 Python 的 url 處理庫真是混亂不堪,我每次都是邊看文檔邊寫代碼的。可是我本身很討厭這種「邊查文檔邊寫代碼」的方式,這種現象基本表示:要麼是你對這門語言不熟悉,要麼是這門語言(庫)的 API 設計不怎麼樣。鑑於本身在大學的時候,就已經拿 Python 來寫東西了,語言使用層面上的東西,已經很熟了,可是仍然每次都會陷入那種「邊查邊寫」的境地,這應該是 API 設計出了問題(嗯,必定是這樣的)。python
怎麼說呢,Python 標準庫裏面確實是有幾個設計不佳的,API 命名混亂不堪(小寫+縮寫),並且要精讀文檔才能知曉所有意思。我理想中的 API 應該是見名知義的,庫做者要充分理解調用者的感覺,不該把本身的責任或義務轉嫁到調用者身上。(不過說了那麼多,人家的東西能進標準庫就表示他 NB,愛用用,不用滾 :) )bash
歷史緣由也好,大牛牛逼也罷,都與咱們沒有關係,咱們關心的是:快速且舒服優雅地解決問題。函數
咱們的項目仍是使用 Python 2.7,天然面對的就是 urllib/urllib2/urlparse 這幾個庫。Python 3 裏面將這一塊相關的內容從新梳理了一下,API 什麼的也變得清爽了不少。工具
個人簡單包裝以下:ui
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
"""對urllib/urllib2標準庫的封裝"""
from __future__ import (absolute_import, unicode_literals)
import urlparse
import urllib
class UrlUtils(object):
"""處理URL的工具函數"""
@classmethod
def remove_fragment(cls, urlstr):
return urlparse.urldefrag(urlstr)
@classmethod
def encode_special_chars(cls, query_str_value):
return urllib.quote(query_str_value)
@classmethod
def decode_special_chars(cls, encoded_chars):
return urllib.unquote(encoded_chars)
@classmethod
def encode_query_dict(cls, query_dict):
return urllib.urlencode(query_dict)
@classmethod
def decode_query_dict(cls, encoded_dict):
return urlparse.parse_qs(encoded_dict)
@classmethod
def get_url_instance(cls, urlstr):
return urlparse.urlparse(urlstr, allow_fragments=True)
複製代碼
因爲我寫 API 通常是「按需寫,用到的時候才寫」,而且「喜歡從原型代碼裏面提煉出接口,不太喜歡一開始就設計一個宏偉的藍圖」(能力不行,作不到),因此通常接口的數量也不多。url
如前文所述,Python 標準庫裏面確實有設計爛的地方,這一點須要認可。通常來講,若是一個接口在你須要反覆翻閱文檔才知道如何使用,那這就是你包裝一下方便本身的時候了。spa