如何在Python中调用'with'语句下的整个函数?
How to call the whole function under 'with' statement in Python?
我有以下示例函数:
def Run(self):
with self._resource() as r:
# a lot of code uses |r|
pass
# end of 'with' statement
# end of function body
我不想因为 with
语句中的额外缩进而失去整个函数体的视觉效果 space。
此外,我不想在 class 范围之外调用 _resource()
- 它在某些方面破坏了封装,即这不是一个好方法:
with obj._resource() as r:
obj.Run(r)
有什么漂亮的方法可以 运行 相同的代码而不丢失视觉效果 space?
如果你只有这个函数要处理,那很简单:
class Foo(object):
def Run(self):
with self._resource() as r:
return self._RunWithResource(r)
def _RunWithResource(self, r):
# ...
如果您想重复该模式,装饰器可能会有所帮助。或多或少:
from functools import wraps
def with_resource(f):
@wraps
def wrapper(self, *a, **kw):
with self._resource() as r:
return f(self, r, *a, **kw)
return wrapper
class Foo(object):
@with_resource
def Run(self, r):
# ...
我有以下示例函数:
def Run(self):
with self._resource() as r:
# a lot of code uses |r|
pass
# end of 'with' statement
# end of function body
我不想因为 with
语句中的额外缩进而失去整个函数体的视觉效果 space。
此外,我不想在 class 范围之外调用 _resource()
- 它在某些方面破坏了封装,即这不是一个好方法:
with obj._resource() as r:
obj.Run(r)
有什么漂亮的方法可以 运行 相同的代码而不丢失视觉效果 space?
如果你只有这个函数要处理,那很简单:
class Foo(object):
def Run(self):
with self._resource() as r:
return self._RunWithResource(r)
def _RunWithResource(self, r):
# ...
如果您想重复该模式,装饰器可能会有所帮助。或多或少:
from functools import wraps
def with_resource(f):
@wraps
def wrapper(self, *a, **kw):
with self._resource() as r:
return f(self, r, *a, **kw)
return wrapper
class Foo(object):
@with_resource
def Run(self, r):
# ...