首页 > 解决方案 > 将上下文和令牌用例组合到通用 ABC 中

问题描述

我在这里有一个基本的ABC:

from abc import ABCMeta, abstractmethod

class StreamingService(object, metaclass=ABCMeta):
    @abstractmethod
    def search_one(self, q):
        pass

    @abstractmethod
    def supports_url(self, url):
        pass

    @abstractmethod
    def get_title_from_url(self, url):
        pass

问题是一些扩展 StreamingService 的类对其调用使用上下文,即

class Context:
  def __enter__():
    ...

  def __exit__():
    ...

def search_one(self, context, q):
  ...

context = Context()
client.search_one(context, "query")

而其他类只需要一个字符串token

def search_one(self, token, q):
  ...

token = "abcdef012345"
client.search_one(token, "query")

我可以让 ABC 中的每个函数都需要一个“上下文”变量,由子类所有者来解释。但是,这感觉就像是草率的代码设计,其意图并不明确,并且违反了“上下文”的标准定义。

我可以使用哪些设计模式来融合这两个用例并使其他使用代码的人清楚?

最终目标是统一开发人员与每个流服务交互的方式,以减少混淆和查找每个单独服务的文档的需要。

代码设计领域之外的建议以及我如何与 API 本身交互的建议也值得赞赏。

标签: pythonpython-3.xdesign-patterns

解决方案


我的解决方案是将每个 StreamingService 变成它自己的 ContextManager。每个都需要一个'<strong>enter'和'<strong>exit',但实现取决于子类。

具有客户端的子类在进入/退出时初始化并关闭其客户端。那些使用令牌的人在“<strong>enter”上发送他们的令牌请求,而在“<strong>exit”上什么也不做。


推荐阅读