2013-10-29 93 views
4

我是新來的裝飾器,並試圖寫一個讓我得到命名參數,如果它存在,否則異常或什麼。python裝飾器提取參數

爲了解釋:

# my decorator! 
def test_mem(key, modifier): 
    def deco(func): 
     @wraps(func) 
     def wrapper(*args, **kwargs): 
      # something here, s.t. 
      # print(args + modifier) <------ 
      return func(*args, **kwargs) 
    return wrapper 
return deco 

我的功能

@test_mem('username', modifier = '_allowed') 
def myfunc(arg1, username = None, stuff = None): 
    # logic, this code is always run! 
    return 'Done' 

myfunc(1, 3) 
>>>> '3_allowed' 
myfunc(1, username = 3) 
>>>> '3_allowed' 
myfunc(1, stuff = []) 
>>>> Exception 

當我編碼,我的例1和2是相互排斥的,例如,當工作1例2打破了,反之亦然。我正在嘗試使用它來創建一些自動鍵。

回答

2

您可能還想考慮inspect.getcallargs()。裏面你的裝飾,你可以使用:

dictionary = inspect.getcallargs(func, *args, **kwargs) 
dictionary['username'] # Gets you the username, default or modifed 

從關聯的Python文檔複製:

>>> from inspect import getcallargs 
>>> def f(a, b=1, *pos, **named): 
...  pass 
>>> getcallargs(f, 1, 2, 3) 
{'a': 1, 'named': {}, 'b': 2, 'pos': (3,)} 
>>> getcallargs(f, a=2, x=4) 
{'a': 2, 'named': {'x': 4}, 'b': 1, 'pos':()} 
>>> getcallargs(f) 
Traceback (most recent call last): 
... 
TypeError: f() takes at least 1 argument (0 given)