繁体   English   中英

Python是否具有Haskell的“掩码”或“括号”功能?

[英]Does Python have an equivalent to Haskell's 'mask' or 'bracket' functions?

在Haskell中,我们有异步异常; 我们可以使用throwTo在另一个线程中引发任何异常:

 throwTo :: Exception e => ThreadId -> e -> IO () 

throwTo在目标线程中引发任意异常(仅限GHC)。

为了能够编写带有“将在获取锁之后始终释放锁定”的保证的代码,我们有mask来运行代码,其中异步异常只能在计算阻塞时接收:

 mask :: ((forall a. IO a -> IO a) -> IO b) -> IO b 

执行带有异步异常屏蔽的IO计算。 也就是说,任何尝试使用throwTo在当前线程中引发异常的线程throwTo将被阻塞,直到再次取消屏蔽异步异常。

和更强的uninterruptibleMask在异步例外不会在所有屏蔽的计算过程中提出的:

 uninterruptibleMask :: ((forall a. IO a -> IO a) -> IO b) -> IO b 

mask一样,但掩码计算不可中断

掩码用于实现更高级别的抽象,如bracket

 bracket :: IO a -- computation to run first ("acquire resource") -> (a -> IO b) -- computation to run last ("release resource") -> (a -> IO c) -- computation to run in-between -> IO c -- returns the value from the in-between computation 

当你想获取资源,做一些工作,然后释放资源时,最好使用bracket ,因为bracket将安装必要的异常处理程序以在发生异常时释放资源计算。 如果引发异常,则bracket将重新引发异常(执行发布后)。

如果我理解正确,Python有一种(不那么通用的)异步异常形式,最显着的表现形式是KeyboardInterrupt

当用户按下中断键(通常是Control - CDelete )时触发。 在执行期间,定期检查中断。

关于何时可能发生“检查中断”的文档是不确定的,但似乎暗示可能在程序执行的任何时刻引发KeyboardInterrupt 因此,似乎Python的异步异常伴随着保持正确性的所有相同的微妙困难。

例如,考虑这样的模式:

x = None
try:
    x = acquire()
    do_something(x)    # (1)
finally:
    if x is not None:  # (2)
        release(x)

如果在(1)期间引发任何异常,那么我们可以确保将执行finally块的内容。 但是如果KeyboardInterrupt(2)期间会发生什么?

似乎根本不可能在存在asyc异常的情况下保证资源清理,而无法掩盖它们。 是否有一些设施,或者我们依靠鸵鸟算法

这就是上下文管理器的用途。

with acquire() as x:
    do_something(x)

acquire返回一个对象,其类型定义__enter__方法,该方法返回绑定到x的值,以及__exit__方法,该方法在with语句的末尾执行,而不管语句是如何退出的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM