我想制作一个函数,如果用with
语句调用,它也可以充当上下文管理器。用法示例为:
# Use as function
set_active_language("en")
# Use as context manager
with set_active_language("en"):
...
这与使用标准功能
open
的方式非常相似。这是我想出的解决方案:
active_language = None # global variable to store active language
class set_active_language(object):
def __init__(self, language):
global active_language
self.previous_language = active_language
active_language = language
def __enter__(self):
pass
def __exit__(self, *args):
global active_language
active_language = self.previous_language
此代码不是线程安全的,但这与问题无关。
我对这种解决方案不满意的是,类构造函数伪装成一个简单的函数,仅用于其副作用。
有一个更好的方法吗?
请注意,我尚未测试此解决方案。
更新:我不想将功能和上下文管理器拆分为单独的实体的原因是命名。该函数和上下文管理器基本上执行相同的操作,因此为这两个名称使用一个名称似乎是合理的。如果我想将上下文处理器命名为独立名称,则可能会出现问题。应该是什么
active_language
?该名称可能(并将)与变量名冲突。 override_active_language
可能有效。 最佳答案
从技术上讲,您不能执行此操作。但是您可以伪造得足够好,以至于人们(没有想得太多)不会注意到。
def set_active_language(language):
global active_language
previous_language = active_language
active_language = language
class ActiveScope(object):
def __enter__(self):
pass
def __exit__(self, *args):
global active_language
active_language = previous_language
return ActiveScope()
当用作函数时,
ActiveScope
类只是一个有点浪费的无操作。关于python - 使用上下文管理器作为功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39884579/