Python 有没有传递命名参数的方法?

Python 有没有传递命名参数的方法?,python,parameters,Python,Parameters,这是我的密码: def update_tags_with_value(tags, many_to_many_class): if tags: many_to_many_class.objects.filter( personne=self.instance, date_v_fin=None ).update(date_v_fin=django_datetime.now()) for idx_

这是我的密码:

def update_tags_with_value(tags, many_to_many_class):
    if tags:
        many_to_many_class.objects.filter(
            personne=self.instance,

            date_v_fin=None
        ).update(date_v_fin=django_datetime.now())
        for idx_tag_with_value in tags:
            pl = many_to_many_class.objects.create(
                personne=self.instance,
                langue=TagWithValue.objects.get(
                    pk=idx_tag_with_value
                )
            )
            pl.save()

update_tags_with_value(self.cleaned_data.get('known_languages'),
                       PersonneLangue)
update_tags_with_value(self.cleaned_data.get('types_permis'),
                       PersonneTypesPermis)
所以我发现我可以轻松地将类作为参数传递。但最后一个问题是关于命名参数。如果你看我的代码,我会做一个
langue=TagWithValue..[blabla]
。问题是它是一个“命名”参数,我希望能够这样传递它:

update_tags_with_value(self.cleaned_data.get('known_languages'),
                       PersonneLangue, 'langue')
update_tags_with_value(self.cleaned_data.get('types_permis'),
                       PersonneTypesPermis, 'permis')
然后以某种方式这样称呼它(它还不起作用):

现在我得到了这个错误:

'champ' is an invalid keyword argument for this function
更准确地说,我需要调用
many-To-many-class.objects.create()
一次调用
known-languages=blablabla
,另一次调用
types-permis=blablablabla
,换句话说,应该调用一次
many-To-many-class.objects.create(known-languages=blablablablablabla)和
many-To-many-class.objects.create(types_permis=blabla)
我想知道是否有一种方法可以只精确参数的名称,而不是
blabla


如何解决这个问题?

似乎正常的关键字解包可以工作

kwargs = {champ: TagWithValue.objects.get(
                     pk=idx_tag_with_value)}
pl = many_to_many_class.objects.create(
                    personne=self.instance,
                    **kwargs)

当然,现在
champ
可能不是函数参数的最佳名称,但希望您能理解。

这是我的工作解决方案,我不知道这是否是最好的“pythonic”方式,但它的工作方式很有魅力:

def update_tags_with_value(tags, many_to_many_class, champ):
    if tags:
        many_to_many_class.objects.filter(
            personne=self.instance,
            date_v_fin=None
        ).update(date_v_fin=django_datetime.now())
        for idx_tag_with_value in tags:
            args = {
                'personne': self.instance,
                champ: TagWithValue.objects.get(
                    pk=idx_tag_with_value
                )}
            pl = many_to_many_class.objects.create(**args)
            pl.save()

update_tags_with_value(self.cleaned_data.get('known_languages'),
                       PersonneLangue, 'langue')
update_tags_with_value(self.cleaned_data.get('types_permis'),
                       PersonneTypePermis, 'type_permis')
update_tags_with_value(self.cleaned_data.get('diplomes'),
                       PersonneDiplome, 'diplome')
update_tags_with_value(self.cleaned_data.get('centres_dinteret'),
                       PersonneCentreDInteret, 'centre_dinteret')
update_tags_with_value(self.cleaned_data.get('hobbies'),
                       PersonneHobby, 'hobby')

我不是100%理解你想要什么,但可能对你有用。你可以创建一个字典并将它传递给一个函数,就像它是一个关键字参数的集合一样。我的问题是,严格来说,我需要调用
many\u to\u many\u class.objects.create()
一次使用
known_languages=blabla
另一次使用
types_permis=blablabla
,换句话说,应该调用一次
many-to-many-many-class.objects.create(known-languages=blablablabla)
many-to-many-many-to-many-class.objects.create(types_-permis=blablablablabla)
我想知道是否有一种方法可以只精确参数的名称,而不是
blabla
def update_tags_with_value(tags, many_to_many_class, champ):
    if tags:
        many_to_many_class.objects.filter(
            personne=self.instance,
            date_v_fin=None
        ).update(date_v_fin=django_datetime.now())
        for idx_tag_with_value in tags:
            args = {
                'personne': self.instance,
                champ: TagWithValue.objects.get(
                    pk=idx_tag_with_value
                )}
            pl = many_to_many_class.objects.create(**args)
            pl.save()

update_tags_with_value(self.cleaned_data.get('known_languages'),
                       PersonneLangue, 'langue')
update_tags_with_value(self.cleaned_data.get('types_permis'),
                       PersonneTypePermis, 'type_permis')
update_tags_with_value(self.cleaned_data.get('diplomes'),
                       PersonneDiplome, 'diplome')
update_tags_with_value(self.cleaned_data.get('centres_dinteret'),
                       PersonneCentreDInteret, 'centre_dinteret')
update_tags_with_value(self.cleaned_data.get('hobbies'),
                       PersonneHobby, 'hobby')