jmd*_*_dk 9 python with-statement contextmanager python-3.x
我经常需要用别的东西临时切换一个变量的值,做一些依赖于这个变量的计算,然后将变量恢复到它的原始值。例如:
var = 0
# Assign temporary value and do computation
var_ori = var
var = 1
do_something_with_var() # Function that reads the module level var variable
# Reassign original value
var = var_ori
Run Code Online (Sandbox Code Playgroud)
这似乎是使用上下文管理器(with语句)的明显机会。Python 标准库是否包含任何这样的上下文管理器?
我知道这种事情通常由其他更好的方法处理,而不是临时更改变量。然而,我并不是要求明显的解决方法。
在我的实际工作案例中,我无法更改该do_something_with_var功能。实际上,这甚至不是一个函数,而是作为元编程的一部分在全局命名空间上下文中求值的一串代码。我给出的例子是我能想到的最简单的例子,它使我的问题与临时变量有关。我没有要求获得我的示例代码的解决方法(正确版本),而是要求获得我书面问题的答案。
不,因为上下文管理器不能像这样在调用者的作用域中分配变量。(任何认为您可以使用locals或做到这一点的人inspect,请尝试使用您在函数内部提出的上下文管理器。它不会起作用。)
有一些实用程序可以对非局部变量的内容执行此操作,例如模块全局变量、其他对象属性和字典...但它们及其unittest.mock.patch相关函数,因此在将它们用于非测试环境。像“暂时修改这个东西然后恢复它”这样的操作往往会导致代码混乱,并且可能表明您使用了太多的全局状态。
| 归档时间: |
|
| 查看次数: |
3392 次 |
| 最近记录: |