Python 使用命名参数作为变量

Python 使用命名参数作为变量,python,django,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':

我正在使用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是一个命名参数,它是模型艺术家中的一个字段,表示数据库中的一列。变量'm0'和m1从urlconf传递到我的get函数,它实际上是我视图类中的一个get方法。 我是否可以在不使用if-else-if链的情况下控制变量death\u year的名称值,即设置为death\u month或birth\u year?因为我有很多选择,我将不得不使用一个非常长的条件链,这个条件链将导致同一行,但只是一个不同的命名参数


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

根据我的了解,您可以构造键,然后传入一个参数来构造dict,然后将其包含在过滤器中

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

据我所知,您可以构造密钥,然后传入一个arg来构造dict,然后将其包含在过滤器中

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

Python中一个基本且功能强大的思想是,您可以传递位置参数列表,而无需编写args[0]、args[1]、,。。。和/或不写foo=kwargs[foo]、bar=kwargs[bar]、,。。。通过在func*参数中使用*和**,**kwargs

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

此示例可能显示了大部分正在运行:

>>> 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是一个dict,因此如果您愿意,可以使用kwargs.keys和所有其他dict方法来反省用户实际传递的内容,并验证、解析、处理等。Django经常使用kwargs.pop来允许获取当前函数的参数,而让其他命名参数向下传播一组可能很深的嵌套函数调用,直到接近底部的例程找到自己的可选关键字参数

Python中一个基本且功能强大的思想是,您可以传递一个位置参数列表,而无需编写args[0]、args[1]、,。。。和/或不写foo=kwargs[foo]、bar=kwargs[bar]、,。。。通过在func*参数中使用*和**,**kwargs

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

此示例可能显示了大部分正在运行:

>>> 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是一个dict,因此如果您愿意,可以使用kwargs.keys和所有其他dict方法来反省用户实际传递的内容,并验证、解析、处理等。Django经常使用kwargs.pop来允许获取当前函数的参数,而让其他命名参数向下传播一组可能很深的嵌套函数调用,直到接近底部的例程找到自己的可选关键字参数

您是否有arg值的示例?Model.objects.filter**dic完全有效,其中dic={'death_year':'foo'}谢谢@Sayse,我确实试过了,但我得到了异常类型:FieldError异常值:无法按dict解析关键字查询。正如我所说,您应该显示您当时尝试的内容,它完全有效,所以arg isarg可以是string还是integer更成问题?在这种情况下,从代码中更容易理解您正在尝试做什么。您有arg值的示例吗?Model.objects.filter**dic完全有效,其中dic={'death_year':'foo'}谢谢@Sayse,我确实试过了,但我得到了异常类型:FieldError异常值:无法按dict解析关键字查询。正如我所说,您应该显示您当时尝试的内容,它完全有效,所以arg isarg可以是string还是integer更成问题?在这种情况下,从代码中更容易理解您试图做什么。{key,arg}或{key:arg}?太棒了!谢谢你无数次@伊兹梅隆电视台-谢谢!Ejonas,不用担心,在平常的地方很难找到血淋淋的细节:{key,arg}或{key:arg}?太棒了!谢谢你无数次@伊兹梅隆电视台-谢谢!埃乔纳斯,别担心,在平常的地方很难找到血淋淋的细节:谢谢!我的问题是,我没有把**放在dict变量之前。谢谢你详细的回答!非常感谢。我的问题是,我没有把**放在dict变量之前。谢谢你详细的回答!