如何在python中实现类似go中的defer
语句?
Defer将函数调用压入堆栈。当包含defer语句的函数返回时,在defer语句最初所在的作用域中,一个接一个地弹出并执行被defer的函数调用。Defer语句看起来像函数调用,但在弹出之前不会执行。
去它是如何工作的例子:
func main() {
fmt.Println("counting")
var a *int
for i := 0; i < 10; i++ {
a = &i
defer fmt.Println(*a, i)
}
x := 42
a = &x
fmt.Println("done")
}
字符串
输出:
counting
done
9 9
8 8
7 7
6 6
5 5
4 4
3 3
2 2
1 1
0 0
型
Go用例示例:
var m sync.Mutex
func someFunction() {
m.Lock()
defer m.Unlock()
// Whatever you want, with as many return statements as you want, wherever.
// Simply forget that you ever locked a mutex, or that you have to remember to release it again.
}
型
7条答案
按热度按时间gblwokeq1#
要模拟
defer fmt.Println(*a, i)
示例,可以使用contextlib.ExitStack
:字符串
Output
型
很容易模拟互斥体的情况:
型
h7appiyu2#
Python的with语句与Go语言的defer语句的作用类似。
Python中类似的代码是:
字符串
ymzxtsji3#
我做了一个there(与2.x兼容):
字符串
defers_collector
的来源是:型
cedebl8k4#
部分受@DenisKolodin answer启发的 defer 实现可作为pygolang,2的一部分提供:
字符串
unftdfkk5#
这个对jfs' answer的补充在装饰器的帮助下进一步推动了
ExitStack
的想法:字符串
with_exit_stack
定义如下:型
9avjhtql6#
为了好玩,我试着做了一个等价的(只是作为概念验证进行测试)
这里是:
字符串
使用示例:
型
zd287kbt7#
有点晚了,但我建立了一个
pip
-installable库,它就是这样做的!查看python-defer
。个字符