3

だから私は自分のジャンゴビューのデコレータを作ろうとしています. デコレータは次のようになります

# Decorator for the function - update(request, extra=None)
def check_super(view):
    def wrapper(request, *args, **kwargs):
        status = supercheck(request)

        if status=="USER":
            raise PermissionDenied
        else:
            args = [a for a in args]
            kwargs = dict((k, v) for k, v in kwargs.items())
            kwargs.update({'status':status})    # Offending line
            return view(request, *args, **kwargs)

    return wrapper

基本的に、スーパーチェック関数でチェックを行い、その結果を別の引数として関数に渡したいのですが、上記の行でエラーが発生します

update() got an unexpected keyword argument 'status'

kwargs はただの辞書ですよね?そのため、そのように新しいバインディングを追加できるはずですが、そのエラーが発生し続けます。この方法でも同じエラーが発生します

kwargs['status']=status
4

2 に答える 2

0

ああ、私はそれを理解しました。私がしなければならなかったことは、元の関数が *args と **kwargs を取ることを確認することだけでした。これは一般化するのがはるかに簡単です (これらの関数がどのようになるかわからないため)

したがって、私の関数 update() にはシグネチャがあります

update(request, extra=None, *args, **kwargs)

そして、ラップする前に kwargs を更新することで、「任意の」キーワードを渡すことができます。明確にしていただきありがとうございます。コメントは、問題の内容を絞り込むのに役立ちました。

唯一の注意点は、更新機能でステータスにアクセスすることです

kwargs['status'] 

ただの代わりに

status

悪くない

于 2013-11-01T00:24:27.363 に答える