我正在使用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'和m1
从urlconf
传递到我的get函数(它在我的视图类中实际上是get
方法)。
我是否可以在不使用if else if链的情况下控制变量death_year
的名称值(即将其设为death_month
或birth_year
)?由于我有很多选择,我将不得不使用一个非常长的条件链来导致同一行,但只有一个不同的命名参数。
我强烈怀疑你应该理解这整个问题来回答这个问题。最初的问题很简单:我可以在Python中使用命名参数及其对应的值作为变量吗?
答案 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)
。 (args
和kwargs
不是保留字,只是常规变量名称
这个例子可能显示了大部分操作:
>>> 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}}允许获取当前函数的参数,同时让其他命名参数沿着可能深层次的嵌套函数调用传播,直到底部附近的例程找到自己的可选关键字参数。