python - 有没有一种方法可以在不使用 Python 中的 eval 的情况下完成 eval 的功能

标签 python eval

我正在教附近的一些 child 使用 Python 编程。我们的第一个项目是将以罗马数字给出的字符串转换为阿拉伯值。

因此,我们开发了一个函数来计算一个罗马数字字符串,该函数接受一个字符串并创建一个列表,其中包含对应的阿拉伯数字以及为计算对应的阿拉伯数字而执行的操作。

例如,假设您输入 XI,该函数将返回 [1,'+',10] 如果您输入 IX,该函数将返回 [10,'-',1] 由于我们需要分别处理相邻值相等的情况让我们忽略提供的值为 XII 的情况,因为它会返回 [1,'=',1,'+',10]以及罗马为 IIX 的情况,因为它将返回 [10,'-',1,'=',1]

这是函数

def conversion(some_roman):
    roman_dict = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M',1000}
    arabic_list = []
    for letter in some_roman.upper():
        if len(roman_list) == 0:
            arabic_list.append(roman_dict[letter]
            continue
        previous = roman_list[-1]
        current_arabic = roman_dict[letter]
        if current_arabic > previous:
            arabic_list.extend(['+',current_arabic])
            continue
        if current_arabic == previous:
            arabic_list.extend(['=',current_arabic])
            continue
        if current_arabic < previous:
            arabic_list.extend(['-',current_arabic])
      arabic_list.reverse()
      return arabic_list

我认为评估结果的唯一方法是使用 eval()

有点像

def evaluate(some_list):
    list_of_strings = [str(item) for item in some_list]
    converted_to_string = ''.join([list_of_strings])
    arabic_value = eval(converted_to_string)
    return arabic_value

我对这段代码有点紧张,因为在某些时候我读到在大多数情况下使用 eval 是危险的,因为它允许有人将恶作剧引入您的系统。但我想不出另一种方法来评估从第一个函数返回的列表。因此无需编写更复杂的函数。

children 得到了转换功能,即使看起来很复杂,他们也能理解罗马数字转换的过程,而且很有道理。当我们谈到评估时,虽然我可以看到他们迷路了。因此,我真的希望有一些方法来评估转换函数的结果,而不需要太多复杂的代码。

对不起,如果这是扭曲的,我就是这样。 . .

最佳答案

Is there a way to accomplish what eval does without using eval

是的,绝对是。一种选择是将整个东西转换成一棵 ast 树并自己解析它(有关示例,请参见 here)。

I am a little bit nervous about this code because at some point I read that eval is dangerous to use in most circumstances as it allows someone to introduce mischief into your system.

这绝对是真的。任何时候您考虑使用 eval 时,都需要考虑您的特定用例。真正的问题是您对用户有多信任以及他们能造成什么损害?如果您将其作为脚本分发并且用户仅在他们自己的计算机上使用它,那么这真的不是问题——毕竟,他们不需要将恶意代码注入(inject)您的脚本来删除他们的主目录。如果您打算在您的服务器上托管它,那完全是另一回事......然后您需要弄清楚字符串的来源以及用户是否可以通过任何方式修改字符串它不受信任地运行。黑客非常聪明1,2,因此在您的服务器上托管这样的东西通常不是一个好主意。 (我一直认为黑客比我更了解 Python)。

1 http://blog.delroth.net/2013/03/escaping-a-python-sandbox-ndh-2013-quals-writeup/

2 http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

关于python - 有没有一种方法可以在不使用 Python 中的 eval 的情况下完成 eval 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20625261/

相关文章:

python - 在 Python、MATLAB 等中使用 eval

python - 什么时候在 Python 中使用按 id 比较?字典键比较?

python - 二维 Numpy 数组的边值

python - gunicorn_django 错误 "cannot find myproject.settings in your PYTHONPATH"

javascript - 评估模板字符串和类实例

php - 包括——使用字符串而不是文件名

python - 在 Python 中将 float 四舍五入为下一个整数的最简单方法是什么?

python - 为每个文件分别创建一个新的 txt 文件,其中包含输出和输入文件的大小信息

c - 用 C 写 `eval()`

c# - 如何评估 C# 中可以被零除的字符串表达式?