9

デコレーター内でコンテキストマネージャーを使用する方法と、デコレーターで作成されたオブジェクトを装飾された関数に渡す方法、およびパラメーター付きのpythonデコレーターを見てきましたが、2つを組み合わせようとしています..しかし、苦労しています私の頭を丸めてください。

@wrapドキュメント文字列が保持されるかどうかはわかっているので、可能であればfunc tools デコレータを使用してこれを行うことをお勧めします。

私がやりたいことはこれです:

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

私はこれがこのように機能するとは思わない. メソッドreturn_employee_namesは接続の反対側のサービスにある. 関数呼び出しを返すだけですか?もしそうなら、どうやってパラメータを渡すのですか?

4

1 に答える 1

8

with にバインドされたオブジェクトを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)

pyro_opener()適切なデコレータ ファクトリにするために、別のネストされた関数を追加する必要があることに注意してください。

于 2015-05-27T17:06:25.483 に答える