透明的 API

  • 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,使其更强大且使用和定制所需代码更少。
阅读 10
0 条评论