使用命名参数作为变量

时间:2016-09-07 10:21:52

标签: python django

我正在使用django,但我认为这个问题主要属于Python本身。

我有类似的东西:

def get(self, request, arg, *args, **kwargs):

    if kwargs['m0'] == 'death':
      if kwargs['m1'] == 'year':
         result = Artists.objects.filter(death_year=arg)
      elif kwargs['m1'] == 'month':
         result = Artists.objects.filter(death_month=arg)
      elif kwargs['m1'] == 'day':
         result = Artists.objects.filter(death_day=arg)
    elif kwargs['m0'] == 'birth':
      if kwargs['m1'] == 'year':
         result = Artists.objects.filter(birth_year=arg)
      elif kwargs['m1'] == 'month':
         result = Artists.objects.filter(birth_month=arg)
      elif kwargs['m1'] == 'day':
         result = Artists.objects.filter(birthh_day=arg)

其中death_year是一个命名参数,它是我的模型Artists中表示数据库中列的字段。变量'm0'和m1urlconf传递到我的get函数(它在我的视图类中实际上是get方法)。 我是否可以在不使用if else if链的情况下控制变量death_year的名称值(即将其设为death_monthbirth_year)?由于我有很多选择,我将不得不使用一个非常长的条件链来导致同一行,但只有一个不同的命名参数。

我强烈怀疑你应该理解这整个问题来回答这个问题。最初的问题很简单:我可以在Python中使用命名参数及其对应的值作为变量吗?

2 个答案:

答案 0 :(得分:5)

从我可以看出你可以构造密钥然后传入一个arg来构造dict,然后将其包含在过滤器中

key = '%s_%s' % (kwargs['m0'], kwargs['m1'])
result = Artists.objects.filter(**{key: arg})

答案 1 :(得分:1)

Python中基本且非常强大的想法是,您可以传递位置参数列表而无需编写args[0], args[1],...和/或关键字参数的字典,而无需使用foo=kwargs["foo"], bar=kwargs["bar"],...编写***中的func( *args, **kwargs)

同样可以编写一个函数来接受任意长度的位置参数列表,以及任何一组不匹配的关键字参数:def func( a, b, c=0, *args, **kwargs)。 (argskwargs不是保留字,只是常规变量名称

这个例子可能显示了大部分操作:

>>> def foo( a, b=0, c=0, *args, **kwargs):
...   print( "a,b,c: ", a, b, c)
...   print( args)
...   print( kwargs)
... 
>>> foo( *[1,2,3,4], **{"baz":42} )
a,b,c:  1 2 3
(4,)
{'baz': 42}

>>> foo( 1, b=2,  **{"baz":42, "c":3} )
a,b,c:  1 2 3
()
{'baz': 42}

>>> foo( **{"baz":42, "c":3, "a":1, "zork":"?" } )
a,b,c:  1 0 3
()
{'zork': '?', 'baz': 42}

kwargs是一个字典,所以如果你愿意,可以使用kwargs.keys()和所有其他dict方法来内省用户实际传递的内容并验证,解析,处理等等.Django经常使用{{ 1}}允许获取当前函数的参数,同时让其他命名参数沿着可能深层次的嵌套函数调用传播,直到底部附近的例程找到自己的可选关键字参数。