如何在上下文管理器中编写装饰器以包装参数?

Pur*_*ret 9 python decorator pyro python-2.7 python-decorators

我已经看到如何在装饰器中使用上下文管理器以及如何将装饰器中创建的对象传递给装饰函数以及带参数的python装饰器,我正在尝试将两者结合起来.但我正在努力让我的头围绕它.

@wrap如果可能的话,我宁愿使用func工具装饰器来执行此操作,因为我知道是否会保留doc字符串.

我想要做的是:

def pyro_opener(func,service,database,port,secret_key):
    def wrapper(params):
        with Pyro4.Proxy("PYRO:"+service+"@"+database+":"+port) as obj:
            obj.set_secret_key(secret_key)
            return obj.func(params)
    return wrapper


@pyro_opener(output_service, employee_db,port=9876,secret_key="h3llow0rld")
def get_employee_names(salary):
    return obj.return_employee_names(salary)  # obj is clearly not in scope here
                                              # but what else can I do?


get_employee_names(25000)

>>>> Bob, Jane, Mary
Run Code Online (Sandbox Code Playgroud)

我认为这不起作用,方法return_employee_names是在连接另一端的服务上.我应该只返回函数调用吗?如果是这样,我怎么通过params呢?

Mar*_*ers 7

你将绑定到的对象传递with ... as给包装函数; 该函数必须接受这样的论证.

这类似于方法的工作方式; 它们只是带有额外第一个参数(self)的函数:

def pyro_opener(service, database, port, secret_key):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kw):
            with Pyro4.Proxy("PYRO:{}@{}:{}".format(service, database, port)) as obj:
                obj.set_secret_key(secret_key)
                return func(obj, *args, **kw)
        return wrapper
    retutrn decorator

@pyro_opener(output_service, employee_db, port=9876, secret_key="h3llow0rld")
def get_employee_names(obj, salary):
    return obj.return_employee_names(salary)
Run Code Online (Sandbox Code Playgroud)

请注意,我必须在其中添加另一个嵌套函数,pyro_opener()以使其成为一个合适的装饰工厂.