属性获取器和上下文管理器

Igo*_*eev 5 python properties decorator contextmanager pandas

我想以这样的方式定义一个属性,无论何时调用它,它都是在上下文管理器中完成的。说吧,我从以下开始:

@property
def hangar(self):
    return self._hangar
Run Code Online (Sandbox Code Playgroud)

每当写下代码时,我都会写:

res = some_function(self.hangar)
Run Code Online (Sandbox Code Playgroud)

我希望它被评价为:

with pandas.HDFStore(...) as hangar:
    some_function(self.hangar)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jsb*_*eno 3

正如您从评论中看到的,您需要的是上下文管理器通常的工作方式“由内而外”。

但这并不能阻止您使函数调用/属性检索“由内而外”完全相同:您所需要的只是不使用“属性”调用所需的方法,而是将目标函数作为参数传递。

沿着这个:

def context_property(method):
    def wrapper(self, target, *args, **kw):
        path = method(self)
        with pandads.HDFStore(path) as context:
            result = target(context, *args, **kw)
        return result
    return wrapper

class MyClass:
    @context_property
    def hangar(self):
        return "path_to_hdfstore"

    def do_stuff(self):
        ...
        value = self.hangar(some_function)
        ...
Run Code Online (Sandbox Code Playgroud)

并将some_function在上下文管理器内运行。如果您需要使上下文管理器本身通用,而不总是“pandas.HDFStore”,您可以在装饰器上多放一层来配置它。