有没有办法重构这个? ** kwarg - django

时间:2017-05-05 19:34:55

标签: python django arguments refactoring

我一直在反复调用相同的模型,但是不同领域的某些东西,但会有一些总是相同的。我在想是否有办法重构它?

例如。

def x(get_filter, **kwargs):
    # if blah 
    return User.object.get(is_active=True, is_deleted=False, is_staff=False, **kwargs)
    # if blah 
    return User.object.filter(is_active=True, is_deleted=False, is_staff=False, **kwargs)
    # if blah 
    return User.object.get(is_active=True, is_deleted=False, **kwargs)
    # if blah 
    return User.object.get(is_active=True, is_deleted=False, is_staff=False, is_superuser=True, **kwargs)

可以看出,始终使用is_active=Trueis_deleted=False。 我想做像

这样的事情
is_deleted = {'is_deleted': False}
is_active = {'is_active': True}
    User.object.filter( is_staff=False, **is_active, **is_deleted,**kwargs)

在我的IDE中,它会说不允许重复**

有人可以给我一个想法吗?

提前致谢

4 个答案:

答案 0 :(得分:2)

当然,试试这个

options = {'is_deleted': False,
           'is_active': True}

kwargs.update(options)
User.object.filter(is_staff=False, **kwargs)

答案 1 :(得分:1)

如果你使用的是Python 3,那确实是允许的:

belongs_to :user_to, FPL.Club, foreign_key: :user_to_id
belongs_to :user_from, FPL.Club, foreign_key: :user_from_id

首先让我们记住,>>> def f(*a, **kwargs): pass ... >>> a = {'a':1} >>> b = {'b':2} >>> f(**a, **b) # No problem! 只是一本字典:它没有任何魔力。如果您有默认的kwargs,可以将它们放在另一个(单个!)字典中:

kwargs

现在,我们有两个词典,这是一个简单的组合问题:How to merge two Python dictionaries in a single expression?

我们可以这样做:

additional_kwargs = {'is_deleted': False, 'is_active': True}

然后正常调用该函数:

kwargs.update(additional_kwargs)

答案 2 :(得分:0)

也许您可以根据条件创建一个包含所需值的新词典并传递给过滤器。如果这样的事情解决了你的问题:

should_delete = True if BLAH else False # your condition here
new_kwargs = dict(**kwargs, is_staff=False, is_deleted = should_delete)
return User.object.filter(**new_kwargs)

答案 3 :(得分:0)

您可以使用Python的functool.partial

from functools import partial
def x(get_filter, **kwargs):
    common_invocation = partial(User.object.get, is_active=True, is_deleted=False)
    # if blah 
    return common_invocation(is_staff=False, **kwargs)
    # if blah 
    return User.object.filter(is_active=True, is_deleted=False, is_staff=False, **kwargs)
    # if blah 
    return common_invocation(**kwargs)
    # if blah 
    return common_invocation(is_staff=False, is_superuser=True, **kwargs)

我这样离开了你的User.object.filter。你应该从中得到这个想法。