【问题标题】:How do I make a python library configurable? (Initialization)如何使 python 库可配置? (初始化)
【发布时间】:2021-03-12 18:59:15
【问题描述】:

我正在创建一个充当库而不是应用程序的 python 库。它是具有复杂响应的 REST API 的包装器,我想抽象解析。然后应用程序可以使用该库。

REST API 围绕 SaaS 产品,因此一个配置部分是域,另一个是 api 密钥。我知道我可以创建一个 ini 文件并使用configparser。但这意味着我仍然需要将配置文件的路径传递给库。但是,dict 会更好,因为这样应用程序可以决定如何存储配置。我还想只初始化一次库,并且没有选项作为方法或构造函数参数(初始化方法除外)。

我怎样才能做到这一点?在使用库之前让应用程序要求调用特定方法(如config(options: dict))是否明智?

编辑:

我能想到的最好的比喻是 REST 的 ORM。假设有房间、书架和书籍,每个都由一组 API 端点(GET、PUT 等)支持。所以我想创建一个类来包装每个项目的这些调用,并且每个类(如 Book、Room 等)都需要访问配置。

重要的是这些项目在系统中是可配置的,例如。管理员可以向他们添加他们想要的任何属性,例如,GET 调用会返回一个属性列表,其中包含关于它们的元数据(id、名称、类型等)。因此需要包装器。

【问题讨论】:

  • 在您的库的配置文件中提供默认值。以编程方式覆盖默认值 - 即通过初始化。

标签: python configuration


【解决方案1】:

我通常将我的配置选项作为构造函数参数,其中 args 是可选的。如果该值没有被覆盖,那么我从环境变量中获取值。这使开发人员无需任何复杂的设置即可轻松覆盖配置。

class Api:
    def __init__(self, url=None, key=None):
        self.url = url or os.environ.get("MYAPP_URL", "safe default")
        self.key = key or os.environ.get("MYAPP_KEY", "safe default")

如果你最终得到大量需要传递的配置项,我会遵循相同的模式,但有一个配置类:

class ApiConfig:
    def __init__(self, url=None, key=None, user=None, region=None):
        self.url = url or os.environ.get("MYAPP_URL", "safe default")
        self.key = key or os.environ.get("MYAPP_KEY", "safe default")
        self.user = user or os.environ.get("MYAPP_USER", "safe default")
        self.region = region or os.environ.get("MYAPP_REGION", "safe default")

class Api:
    def __init__(self, config=None):
        self.config = config or ApiConfig()

【讨论】:

  • 好的。就我而言,每组端点都有许多“Api”类。我能想到的最好的比喻是 REST 的 ORM。假设有房间、书架和书籍,每个都由一组 API 端点(GET、PUT 等)支持。所以我想创建一个类来包装每个项目的这些调用。重要的是这些项目可以由系统配置,例如。管理员可以添加他们想要的任何属性。因此复杂性。
  • @beginner_ 为您的服务创建网关 API 可行吗?这个想法是托管一个服务(网关),它负责以统一的方式调用您的其他微服务/rest api。基本上是一个智能代理。像 GraphQL 这样的东西可能很适合您的用例。 graphql.orgcloudbees.com/blog/graphql-as-an-api-gateway-to-micro-services
【解决方案2】:

嗯,这是一个想法。编写自己的使用字典的配置解析器怎么样?您可以使用 JSON 格式编写配置并使用 json.loads 将其加载为字典。通过这种方式,您可以从任何地方(包括网络)检索配置参数,因为 JSON 是网络友好的。

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多