Обертывание функции Python, которая использует с - PullRequest
0 голосов
/ 25 июня 2019

Скажем, есть функция python foo (), которая использует некоторый ресурс и должна вызываться следующим образом:

   with foo(x,y,z) as f:
       doSomething(f)

Пока все хорошо. Теперь предположим, что foo принимает сложный набор аргументов, основанный на множестве факторов, и я хотел бы определить функцию-оболочку, чтобы упростить ситуацию. Что-то вроде:

def simple_foo():
    if x:
       return foo(a,b,c)
    else:
       return foo(d,e,f)

Теперь я бы хотел использовать simple_foo вместо foo, например:

with simple_foo() as f:
    doSomething(f)

Однако неудивительно, что это не работает. Как я могу написать simple_foo (), чтобы получить это поведение?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вы можете сделать это, написав собственный менеджер контекста, который внутренне вызывает эту функцию, попробуйте код, приведенный ниже:

class SimpleFoo:

   def __init__(self,x,y,z, option):
       self.x = x
       self.y = y
       self.z = z
       self.option = option


    def __enter__(self):
       if self.option:
          return foo(self.x,self.y,self.z)
       else:
          return foo(self.y,self.z,self.x)

   def __exit__(self, type, value, traceback):

       if type != None:
           print("Error in SimpleFoo")
           print("Error Type :", type)
           print("Error Value :", value)
           print("Error Traceback :", traceback)
           self.status = value

Теперь, если вы хотите использовать это, используйте его, как показано ниже:

with SimpleFoo(1,2,3,True) as foo:
     doSomething(foo)

Надеюсь, это поможет.

1 голос
/ 25 июня 2019

Функция декорирования foo() с contextmanager ( документ ):

from contextlib import contextmanager

@contextmanager
def foo(a, b, c):
    try:
        yield a + b + c
    finally:
        pass

def simple_foo(x):
    if x:
        return foo(1, 2, 3)
    return foo(4, 5, 6)

with simple_foo(True) as v:
    print(v)

with simple_foo(False) as v:
    print(v)

Печать:

6
15
...