簡體   English   中英

為什么我可以將命名參數列表(而不是未命名參數)傳遞給此裝飾器?

[英]Why can I pass a list of named arguments — but not unnamed arguments — to this decorator?

這個問題不是“ 如何將未知的未命名參數列表傳遞給python裝飾器?”的重復項 我在這里問一個不同但相關的問題。

我創建了一個python裝飾器my_decorator方法,如下所示。 我希望這個裝飾器接受未知的參數列表:

#!/usr/bin/env python
from functools import wraps

class A:
    def my_decorator(self, func=None, *args, **kwargs):
        print "Hello World2!"
        print 'args = {}'.format(args)
        print 'kwargs = {}'.format(kwargs)
        def inner_function(decorated_function):
            def wrapped_func(*fargs, **fkwargs):
                print "Hello World3!"
                return decorated_function(*fargs, **fkwargs)
            return wrapped_func

        if func:
            return inner_function(func)
        else:
            return inner_function

class B:
    my_a = A()

    @my_a.my_decorator(a1="Yolo", b1="Bolo")
    def my_func(self):
         print "Hello World1!"

my_B = B()
my_B.my_func()

這段代碼可以正常工作:

Hello World2!
args = ()
kwargs = {'a1': 'Yolo', 'b1': 'Bolo'}
Hello World3!
Hello World1!

但是,現在,我不是將命名參數傳遞給@my_a.my_decorator ,而是要傳遞這樣的未命名參數: @my_a.my_decorator('Yolo', 'Bolo')並且它失敗了:

Hello World2!
args = ('Bolo',)
kwargs = {}
Hello World3!
Traceback (most recent call last):
  File "./decorator_test.py", line 20, in <module>
    class B:
  File "./decorator_test.py", line 23, in B
    @my_a.my_decorator('Yolo', 'Bolo')
  File "./decorator_test.py", line 12, in wrapped_func
    return decorated_function(*fargs, **fkwargs)
TypeError: 'str' object is not callable

我怎樣才能解決這個問題?

def my_decorator(self, *args, **kwargs):
    [skip]
    if 'func' in kwargs:
        return inner_function(kwargs.pop('func'))
    else:
        return inner_function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM