gpt4 book ai didi

python - 如何使用户配置可用于模块的所有类

转载 作者:行者123 更新时间:2023-11-28 18:40:09 25 4
gpt4 key购买 nike

我正在编写一个 Python 库,旨在用作第三方库。

great_library/__init__.py:

class ClassA(object):

@cache()
def foo(self):
pass

class ClassB(object):

@cache()
def bar(self):
pass

class GreatLibrary(object):

@classmethod
def great_api(cls):
pass

# uses ClassA and ClassB

这个库被用作:

from great_library import GreatLibrary
GreatLibrary.great_api()

现在的问题是,我希望用户配置缓存过期时间。应该传递给 @cache():@cache(seconds)

我应该如何设计这个模块结构,以便用户可以轻松地传入配置并让它被 classA 和 classB 使用?谢谢

最佳答案

基本问题是传递给装饰器的变量将在加载模块时被读取。所以之前没有办法改变它(至少如果你不想通过一些黑客重新加载模块但不能改变旧对象)。所以你需要一些钩子(Hook),great_library 可以在其中获取缓存时间的值,并且用户可以在其中写入所需的值。

比较简单和广泛使用的方法是设置环境变量。在 great_library 模块的顶部,您可以检查变量并加载默认缓存时间:

import os
default_time = os.getenv("GREAT_LIBRARY_CACHE_TIME", None)

在您的代码中使用@cache(default_time)。我不确定 cache() API 是否将 None 作为默认参数,否则很容易修改收据以使其适应您的问题。

现在 great_library 的用户可以在开发阶段(导入模块之前)通过 os.putenv() 或在生产中的操作系统环境中设置它。

放置钩子(Hook)的另一种方法是使用配置模块来导入。恕我直言,只有当您要设置一堆属性时,该方法才有用。如果您遵循该路径,您的 great_library 模块应该实现以下内容:

try:
from great_library_config import *
except ImportError:
# Default configurations like...
default_time = None

我个人尽量避免像模块那样的解决方案,但对于具有高度可配置性的应用程序或框架可能很有用。无论如何,在这种情况下,用户也可以使用配置模块进行生产,并由开发/测试模块覆盖它。

关于python - 如何使用户配置可用于模块的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com