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

use*_*631 2 python arguments function python-3.x

我有以下功能:

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()
Run Code Online (Sandbox Code Playgroud)

行动是一个阶级.该类有多个属性,我不知道在哪个属性将得到一个值.

我得到属性名称动态.

我希望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)
Run Code Online (Sandbox Code Playgroud)

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

sch*_*ggl 5

使用dict拆包**.请注意 - 如果fk_name是 - 的名称ForeignKey- fk将不是字符串,而是a ForwardManyToOneDescriptor.您可能仍希望设置名为的属性fk_name:

action = Action(user=user, verb=verb, **{fk_name: fk_value})
Run Code Online (Sandbox Code Playgroud)

  • @DanielRoseman嗯,它仍然显示可以使用哪种形式来实现动态关键字分配.OP的问题应该可以转化为此. (2认同)