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')