有没有办法传递命名参数?

时间:2015-12-28 18:38:21

标签: 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_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')

然后以某种方式调用它(它不起作用):

    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:
                pl = many_to_many_class.objects.create(
                    personne=self.instance,
                    champ=TagWithValue.objects.get(
                        pk=idx_tag_with_value
                    )
                )
                pl.save()

现在我收到此错误:

'champ' is an invalid keyword argument for this function

更准确地说,我需要many_to_many_class.objects.create()一次known_languages=blablatypes_permis=blabla再推一次,换句话说,应拨打一次many_to_many_class.objects.create(known_languages=blabla)和{ {1}}我想知道是否有办法精确仅参数名称 many_to_many_class.objects.create(types_permis=blabla)

如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

非常不推荐,但可以使用exec()函数。

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:
            command = """pl = many_to_many_class.objects.create(
                personne=self.instance,""" 
                +
                champ
                + 
                """=TagWithValue.objects.get(
                    pk=idx_tag_with_value
                )
            )"""
            exec(command) 
            pl.save()

但正如我所说,它不是pythonic,很容易失败。你应该对它进行真正的测试,以便继续采用这种方法。

我的建议是将每种情况封装到函数中,并根据传递的参数调用这些函数。
但是为了回答你的问题,这就是它的完成方式。

答案 1 :(得分:0)

似乎普通的关键字解包会起作用。 。

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

当然,现在champ 可能不是函数参数的最佳名称,但希望您明白这一点。

答案 2 :(得分:0)

这是我的工作解决方案,我不知道它是否是最好的" 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')