- Transparent APIs 介绍:是作者和同事 Johan Lübcke 开发的模式/理念,在构建 GUI 时特别好用,在其他一些情况下也有用。
简单 RSS 读取程序示例:
- 初始的
get_feed
函数简单读取 RSS feeds,如import feedparser import requests def get_feed(url): response = requests.get(url=url) return feedparser.parse(response.data)
。 - 遇到密码保护的 RSS feeds 时,通过添加
auth
参数解决,如def get_feed(url, auth=None): response = requests.get(url=url, auth=auth) return feedparser.parse(response.data)
。 - 遇到编码问题时,添加
encoding
参数,如def get_feed(url, auth=None, encoding=None): response = requests.get(url=url, auth=auth) if encoding is not None: response.encoding = encoding return feedparser.parse(response.data)
。 - 遇到生成损坏 XML 的 feeds 时,添加
replacement
参数,如def get_feed(url, auth=None, encoding=None, replacement=None): response = requests.get(url=url, auth=auth) if encoding is not None: response.encoding = encoding d = response.data if replacement is not None: d = d.replace(replacement[0], replacement[1]) return feedparser.parse(d)
,后续还根据需要修改为处理多个替换的情况。
- 初始的
透明 API 的解决方案:
- 以
@dispatch
装饰器实现get_feed
的透明 API,如@dispatch(fetch__call_target=requests.request, fetch__method='get', decode=lambda response: response.data) def get_feed(url, fetch, decode): response = fetch(url=url) data = decode(response) return feedparser.parse(data)
。 - 展示不同情况下
get_feed
的调用,简单情况不变,复杂边缘情况容易处理且不污染get_feed
的代码,如get_feed('https://foo.com')
、get_feed('https://bad-encoding.foo.com', fetch__encoding='latin-1')
等。
- 以
- 进一步优化设想:如果 requests 的请求函数考虑到透明 API,能直接传递
decode
参数作为 lambda 会更干净。 - 在 iommi 库中的应用:在 iommi库中使用这种 API 风格效果很好,有更复杂和深度嵌套的调度,简化了 API,使其更强大且使用和定制所需代码更少。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。