我有五六个资源,有很好的"使用"处理程序,通常我会这样做:
with res1, res2, res3, res4, res5, res6:
do1
do2
Run Code Online (Sandbox Code Playgroud)
但是,有时不应激活这些资源中的一个或多个.这导致非常难看的重复代码:
with res1, res3, res4, res6: # these always acquired
if res2_enabled:
with res2:
if res5_enabled:
with res5:
do1
do2
else:
do1
do2
else if res5_enabled:
with res5:
...
Run Code Online (Sandbox Code Playgroud)
必须有干净简便的方法来做到这一点吗?
您可以创建一个支持该with语句的包装器对象,并在那里进行检查.就像是:
with wrapper(res1), wrapper(res2), wrapper(res3):
...
Run Code Online (Sandbox Code Playgroud)
或者一个包装器来处理所有这些:
with wrapper(res1, res2, res3):
...
Run Code Online (Sandbox Code Playgroud)
你的包装器的定义是:
class wrapper(object):
def __init__(self, *objs):
...
def __enter__(self):
initialize objs here
def __exit__(self):
release objects here
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,你可以这样做:
from contextlib import contextmanager, nested
def enabled_resources(*resources):
return nested(*(res for res,enabled in resources if enabled))
# just for testing
@contextmanager
def test(n):
print n, "entered"
yield
resources = [(test(n), n%2) for n in range(10)]
# you want
# resources = [(res1, res1_enabled), ... ]
with enabled_resources(*resources):
# do1, do2
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |