我有一个函数可以返回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()
之后对其进行抽象。这样,如果需要,该模块是完全独立的。 。
话虽如此,但我并不完全相信这是一个好主意,还是我不应该直接返回使用全局对象。
答案 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