2011-04-17 58 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)) 
相关问题