使用对象的全局版本(如果存在)

时间:2019-06-26 19:43:02

标签: python

我有一个函数可以返回API客户端对象(如果它存在于全局范围内),或者如果不存在则创建一个新的对象:

api_client = some_api.Client()

def _get_client():
    if "client" in globals():
        client = globals()["api_client"]
    else:
        client = some_api.Client()

    return client

def foo():
    client = _get_client()
    client.do_stuff()

这符合我的预期,但是我不确定这是否是正确的和/或Pythonic的方式。我的用例是,在大多数云提供商中,在全局范围内声明的功能即服务产品(例如AWS Lambda,Google Cloud Functions)对象可以在函数调用之间重用。这样可以减少每个请求需要建立的网络连接数量。

虽然我只能在使用全局对象的函数中引用它,但是很难测试,这就是为什么我喜欢在_get_client()之后对其进行抽象。这样,如果需要,该模块是完全独立的。

话虽如此,但我并不完全相信这是一个好主意,还是我不应该直接返回使用全局对象。

2 个答案:

答案 0 :(得分:4)

当本地作用域中不存在某些名称时,函数将自动查看模块级作用域,即全局作用域。因此,您可以请求宽恕

,而不是检查globals字典
def _get_client():
    try:
        return api_client
    except NameError:
        return some_api.Client()

答案 1 :(得分:1)

假设您的API客户端绝不虚假,您只需考虑将全局初始化为None就可以提供不同的想法。然后你可以做类似的事情

api_client = None

def _get_client():
    return api_client or whatever_default