【问题标题】:How do I use a string as a keyword argument?如何使用字符串作为关键字参数?
【发布时间】:2010-05-28 21:26:41
【问题描述】:

具体来说,我正在尝试使用字符串来任意过滤 ORM。我已经尝试过 exec 和 eval 解决方案,但我遇到了困难。下面的代码不起作用,但这是我知道如何解释我要去哪里的最好方法

from gblocks.models import Image
f = 'image__endswith="jpg"' # Would be scripted in another area, but passed as text <user input>
d = Image.objects.filter(f)


#for the non-django pythonistas:
d = Image.objects.filter(image__endswith="jpg")
# would be the non-dynamic equivalent.

【问题讨论】:

    标签: python


    【解决方案1】:
    d = Image.objects.filter(**{'image__endswith': "jpg"})
    

    【讨论】:

      【解决方案2】:

      您需要从关键字中分离出值,然后使用关键字作为键,将值作为值来设置字典。然后,您可以将双星号函数参数与 dict 一起使用。

      所以...

      keyword, sep, value = f.partition('=')
      kwargs = {keyword: value.strip('"')}
      d = Image.objects.filter(**kwargs)
      

      请注意,此代码假定关键字中不会有任何等号“=”(它们仅用于将关键字与值分开),并且值将用引号括起来。

      【讨论】:

      • 不要剥离它。请改用ast.literal_eval()
      • 好的,与此相关,如果我还想将datetime.date(2005, 1, 3) 作为有效过滤器,我可以使用常规的 eval() 吗?
      【解决方案3】:

      eval 选项应该可以正常工作,只要您将它包裹在整个表达式中,而不仅仅是 f

      f = 'image__endswith="jpg"'
      d = eval('Image.objects.filter(' + f + ')')
      

      【讨论】:

      • 在用户输入中使用eval() 是危险的。如果f = "__import__('os').system('do something bad')" 怎么办?有关详细信息,请参阅 Ned Batchelder 的 Eval really is dangerous
      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2020-10-31
      • 2012-05-17
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多