在我被“评估是邪恶”的人群打死之前,在这种情况下这是必要的邪恶,我无法改变它。 Eval 有其用途,并且在严格控制的环境中它非常强大。
然而,我有一个没有明显解决方案的问题,我希望能够跳出框框思考。
>>> mydict = {"a-b": "woohoo"}
>>> mydict["a-b"]
'woohoo'
>>> eval('mydict["a-b"]')
'woohoo'
>>> eval('a-b', mydict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'a' is not defined
不幸的是,最后一种情况是我被迫使用的,显然它不起作用。有什么想法如何将表达式评估为我的“全局”或“局部”对象而不让它将 - 解释为减号运算符吗?我的“全局”对象中的一些键的键名称中确实有破折号,这是我无法控制的数据。
到下面的评论。
- 数据是从外部来源传给我的。我根本无法决定或控制数据的格式。
- 我正在评估的“条款”来自于存储的用户配置。
这是一个更大系统的一部分,用户可以通过 api 推送 JSON 数据,我们在内部将数据作为字典处理,然后对数据应用某些规则。这些规则由管理员通过 Web 界面作为配置提供。
最终,我需要允许用户给我一个(可能很复杂的)python oneliner,并根据字典对其进行评估。这不正是如此吗eval
是为了?如果有更好的方法,我无法指定数据的格式,并且必须允许用户给我一个string有评价吗? Eval 很神奇,因为它可以让用户做很多很酷的事情,比如使用.get()
and len()
,但显然它也有缺点,就像前面提到的无法区分或逃脱-
.
Thanks!
您试图在评估期间使字符串“a-b”成为符号。传统上,这不起作用,因为“-”(连字符)不是word。只有 [A-Za-z0-9_] (word) 字符可以用在符号名称中。将连字符更改为下划线效果很好:
>>> mydict = {"a_b": "woohoo"}
>>> eval('a_b', mydict)
'woohoo'
>>>
然而,在 Python3 中,许多 Unicode 字符可以在符号中使用,并且某些字符可能足以替代 ASCII 连字符:
>>> mydict = {"aᐨb": "woohoo"}
>>> eval('aᐨb', mydict)
'woohoo'
>>>
在这里,我使用了加拿大音节最后的短横笔画(尽管显然滥用了此代码的预期目的。)请参阅帖子Python3 变量名接受哪些 Unicode 符号? https://stackoverflow.com/questions/17043894/what-unicode-symbols-are-accepted-in-python3-variable-names有关此方法的更多信息。
我需要允许用户给我一个(可能很复杂的)python 一个
并根据字典对其进行评估。
如果是这样的话,不应该a
and b
成为该字典的一部分,这解决了问题:
>>> mydict = {"a": 34, "b": 13}
>>> eval('a-b', mydict)
21
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)