编写此函数声明的更多pythonic方法是什么

时间:2011-04-17 03:16:38

标签: django python

为了简洁起见,这是最基本的要素。我知道下面的内容是多余的,但是我离题了。

我想知道是否有一种更聪明,更简洁的方式来写这个

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)

正如您所看到的,两个必需的参数,一些(或可能更多)可选的参数被重载。

有什么更好的方式来写这个,这样我就不会围绕这些关键词了?

3 个答案:

答案 0 :(得分:6)

使用unpacking of arguments

def create_action(*args, **kwargs):
    action = Action(*args, **kwargs)

答案 1 :(得分:5)

首先,删除默认args部分之间的空格。您也可能不需要使用关键字参数来调用Action()例如

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

这是使用默认参数的传统Python风格。

坦率地说,我不明白为什么这个功能是必要的。它没有返回任何东西(我想你只是忘了返回动作,它完成的一切都应该在__init__类的Action方法中完成(我假设它是一个类),例如< / p>

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

为了简洁起见,我根本不会编写该函数,只是在类的__init__方法中使用默认参数。

答案 2 :(得分: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))