如何将字符串作为参数名称传递?

时间:2017-12-20 13:34:36

标签: python python-3.x function arguments

我有以下功能:

def create_act(user, verb, fk_name=None, fk_value=None):
    fk = getattr(Action, fk_name)
    action = Action(user=user, verb=verb, fk=fk_value)
    action.save()

行动是一个阶级。该课程有多个属性,我不知道哪个属性会得到一个值。

我将属性名称设为动态。

我希望kwarg fk成为类动作的实际属性。 FK可以是账户或公司。

class Action(models.Model):

account = models.ForeignKey(Account, blank=True, null=True, related_name='activity', on_delete=models.CASCADE)
company = models.ForeignKey(Company, blank=True, null=True, related_name='activity', on_delete=models.CASCADE)

我在论坛上找到了一些答案,但与我无关,或者在python中。 我在其他网站上看到了一些使用eval的建议,但eval并不安全。

2 个答案:

答案 0 :(得分:5)

使用dict解压缩**。请注意 - 如果fk_nameForeignKey的名称 - fk不是字符串,而是ForwardManyToOneDescriptor。您可能仍想设置名为fk_name的属性:

action = Action(user=user, verb=verb, **{fk_name: fk_value})

答案 1 :(得分:1)

这个想法是动态地传递给类创建一对属性名称和值,为此,使用name / value属性创建一个字典并使用字典解包传递它:

def create_act(user, verb, name, value):
    attrs = {name: value}
    action = Action(user=user, verb=verb, **attrs)
    action.save()
    return action