将上下文和令牌用例组合到通用 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")

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

def search_one(self, token, q):
  ...
token = "abcdef012345"
client.search_one(token, "query")

我可以让 ABC 中的每个函数都需要一个"上下文"变量,由子类所有者来解释。然而,这感觉像是草率的代码设计,不清楚其意图,并打破了"上下文"的标准定义。

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

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

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

我的解决方案是将每个 StreamingService 转换为自己的 ContextManager。每个都需要">进入"和">退出",但实现取决于子类。

具有客户端的子类在进入/退出时初始化并关闭其客户端。那些使用令牌的人在">进入"时发送令牌请求,而在">退出"时不执行任何操作。

最新更新