2011-04-17 71 views
0

爲了簡潔起見,這被簡化爲最基本的元素。我明白,下面是書面的冗餘,但我離題了。什麼是更加pythonic的方式來寫這個函數聲明

我想知道是否有寫這個

def create_action(context, verb, actor = None, target = None, permission_level = None): 
    action = Action(context = context, verb = verb, actor = actor, target = target, permission_level = permission_level) 

正如你可以看到,兩個參數一個更聰明,更簡潔的方式,極少數(或可能更多)可選填過載。

什麼是更好的方式來寫這個,這樣我就不會圍繞這些關鍵字?

回答

5

首先,刪除默認參數部分之間的空格。您也可能不需要使用關鍵字參數來呼叫Action()例如

def create_action(context, verb, actor=None, target=None, permission_level=None): 
    action = Action(context, verb, actor, target, permission_level) 

這是使用默認參數的傳統Python風格。

坦率地說,我不明白爲什麼這個功能是必要的。它不返回任何東西(我想你忘記了返回的行動,一切就完成應該在__init__方法做了Action類(我認爲這是一個類),如

class Action(object): 
    def __init__(context, verb, actor=None, target=None, permission_level=None): 
     # Do something 

爲了簡潔,我也不會在所有寫功能,只需使用默認參數在類的__init__方法

+0

他可能正在爲他無法控制的GUI庫創建包裝類。如果函數只接受命名參數,他必須傳遞命名參數。從僅存在副作用的函數可能沒有任何迴應。 – dietbuddha 2011-04-17 04:25:12

+1

@dietbuddha問題被標記爲Django,所以這是值得懷疑的。 – 2011-04-17 04:33:39

+0

好點,我沒有注意到django標籤。 – dietbuddha 2011-04-17 04:38:10

0

如果你想:

  • 確保contextverb明確地傳遞
  • 只有通過合法ARGS

你可以做這樣的事情。

optional = ('actor', 'target', 'permission_level') 
def create_action(context, verb, **opt): 
    args = dict([(k, opt.get(k, None) for k in optional]) 
    action = Action(context, verb, **args) 

或者這個如果你想將它們全部作爲命名參數傳遞。

optional = (('actor', None), ('target', None), ('permission_level', None)) 
required = ('context', 'verb') 
def create_action(*a, **kv): 
    req = zip(required, a) 
    opt = [(t[0], kv.get(t[0], t[1])) for t in optional] 
    action = Action(**dict(req + opt)) 
相關問題