我想创建一个函数,如果用with语句调用它也可以充当上下文管理器。示例用法是:
# Use as function
set_active_language("en")
# Use as context manager
with set_active_language("en"):
...
Run Code Online (Sandbox Code Playgroud)
这与标准函数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
Run Code Online (Sandbox Code Playgroud)
这段代码不是线程安全的,但这与问题无关。
我不喜欢这个解决方案的一点是,类构造函数伪装成一个简单的函数,仅用于它的副作用。
有一个更好的方法吗?
请注意,我尚未测试此解决方案。
更新:我不想将函数和上下文管理器拆分为单独的实体的原因是命名。函数和上下文管理器基本上做同样的事情,所以对两者使用一个名称似乎是合理的。如果我想将它分开,命名上下文处理器将是有问题的。应该是什么?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()
Run Code Online (Sandbox Code Playgroud)
当用作函数时,该类ActiveScope只是一个有点浪费的空操作。
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |