条件python与

Wil*_*ill 4 python

我有五六个资源,有很好的"使用"处理程序,通常我会这样做:

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)

必须有干净简便的方法来做到这一点吗?

raf*_*ufo 5

您可以创建一个支持该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)


Joc*_*zel 5

如果我理解正确,你可以这样做:

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)