在pep343(上面链接)中,with
需要方法__enter__
和{
class MyConnection:
def __init__(self):
pass
def __enter__(self):
print "constructor"
# TODO: open connections and stuff
# make the connection available in the with-block
return self
def __exit__(self, *args):
print "destructor"
# TODO: close connections and stuff
with MyConnection() as c:
# TODO: do something with c
pass
产生输出(如预期):
^{pr2}$真的应该这么简单吗?除此之外还有什么要考虑的?为什么这么多的库(表面上)还缺少这个功能?我错过什么了吗?在
我在尝试在库中实现'with'功能时遇到的一个问题是找到一种处理失败异常的优雅方法。考虑到以下因素:
如何处理不可避免的“IOError:[Errno 2]没有这样的文件或目录:'。/不_存在.txt'例外?总是有“尝试/排除”的方法
^{pr2}$这种直接的方法是可行的,但我认为它有损于使用'with'结构的简单性。也许有人有更优雅的解决方案?在
这个问题的解决方法更多的是一个问题而不是一个答案,但这是我在尝试实现“with”时遇到的问题之一。在
(a)就这么简单
(b)另一种方法是decorator函数,它修饰函数(和类,但不适用于本用例),还允许在包装函数之前和之后调用代码。这些似乎更为常见。在
(c)我不认为你遗漏了什么。在
相关问题 更多 >
编程相关推荐