gpt4 book ai didi

python - 使用(out) eval() 执行用户给出的操作

转载 作者:行者123 更新时间:2023-11-28 17:47:53 24 4
gpt4 key购买 nike

我有许多操作大文件的 python 代码。在其中一些中,我在列之间执行操作或选择它们的内容。由于输入文件可以有不同的结构,操作是通过命令行提供的,语法类似于 c3 + c5 -1(c3<4) & (c5>4)(或组合)。 c4 被解释为输入文件的第四列

我的文件看起来像这样('input_file.txt'):

21.3   4321.34   34.12   4   343.3  2  324
34.34 67.56 764.45 2 54.768 6 45265
986.96 87.98 234.09 1 54.456 3 5262
[...]

假设我想将第 4 列与第 5 列相加并减去 1。
我会做

import re
import numpy as np

operation = "c3 + c5 -1" #in reality given from command line
pattern = re.compile(r"c(\d+?)") # compile the regex that matches the column number
# get the actual expression to evaluate
to_evaluate = pattern.sub("ifile[:,\\1]", operation)
#to_evaluate is: "ifile[:,3] + ifile[:,5] -1"

ifile = np.loadtxt('input_file.txt')
result = eval(to_evaluate) #evaluate the operation required
print(result)
# do the rest

输出

[5, 7, 3, ...]

我想到这个实现是因为:

  1. 如果我想更改读取文件的方法(目前我可以决定使用 numpypandas )或者我想添加操作,编写和修改都很容易
  2. 在我能做的事情上给了我很大的自由度。我可以用同样的方式对待 c3 + c5 -1(c3<4) & (c5>4)(c2+c4)>0
  3. 我的所有代码都有相同的签名:出错的可能性较小

我知道 eval 可能不安全(尽管目前我是这些代码的唯一用户)并且可能比相应的代码慢,但我想不出更好的方法。

有人知道实现此类操作的更好/更安全的方法吗?

额外编辑:如果重要的话,我正在运行 python 2.7

最佳答案

你可以做一个更安全的评估

def safe_eval(eval_str, variable_dict = None):
'''welll... mostly safe:
http://lybniz2.sourceforge.net/safeeval.html
'''
if variable_dict == None:
variable_dict = {}
return eval(eval_str, {"__builtins__" : None}, variable_dict)

虽然对于非常了解 python 的人来说,它永远不会完全安全(有关示例,请参见 http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)

虽然您的申请让我感到困惑,所以我不确定我还能为您提供多少帮助!


我不确定这是否有助于解决您正在做的事情,但您可以做的一件事是将模块中的所有函数编译成字典。

所以你可以通过类似的方式编译你想使用的函数:

module_dict = {}
for n in dir(module):
module_dict[n] = eval('module.'+n)

(我相信此功能是 python 3 中的标准功能。即可以访问所有模块模块字典。)这会将所有函数调用置于字典形式,从而加快调用速度。它还解决了评估安全问题。

如果您尝试使用“+”或“=”等操作,您可以从 object.add 和 object.eq 获取它们的函数调用。您可以将这些调用存储到您的字符串语法中。

不确定是否有帮助。

关于python - 使用(out) eval() 执行用户给出的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15437955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com