相关疑难解决方法(0)

为什么使用'eval'是一种不好的做法?

我正在使用以下课程轻松存储我的歌曲数据.

class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            exec 'self.%s=None'%(att.lower()) in locals()
    def setDetail(self, key, val):
        if key in self.attsToStore:
            exec 'self.%s=val'%(key.lower()) in locals()
Run Code Online (Sandbox Code Playgroud)

我觉得这比写出一个if/else块更具可扩展性.但是,eval似乎被认为是一种不良做法并且使用起来不安全.如果是这样,任何人都可以向我解释为什么并告诉我一个更好的方法来定义上面的类?

python eval

125
推荐指数
6
解决办法
3万
查看次数

评估字符串中的数学表达式

stringExp = "2^4"
intVal = int(stringExp)      # Expected value: 16
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:

Traceback (most recent call last):  
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int()
with base 10: '2^4'
Run Code Online (Sandbox Code Playgroud)

我知道eval可以解决这个问题,但是不是有更好的 - 更重要的 - 更安全的方法来评估存储在字符串中的数学表达式吗?

python math

99
推荐指数
10
解决办法
10万
查看次数

Python:使eval安全

我想要一种简单的方法在Python中执行"计算器API".

现在,我并不关心计算器将支持的确切功能集.

我希望它接收一个字符串,"1+1"并在我们的例子中返回一个包含结果的字符串"2".

有没有办法让eval这种东西安全?

首先,我会这样做

env = {}
env["locals"]   = None
env["globals"]  = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None

eval(users_str, env)
Run Code Online (Sandbox Code Playgroud)

这样调用者就不会搞乱我的局部变量(或看到它们).

但我相信我在这里监督很多.

eval安全问题是否可以解决,或者是否存在太多微小的细节以使其正常工作?

python eval

39
推荐指数
2
解决办法
3万
查看次数

为什么Python 3中的编译器包已经停止?

我只是惊喜地发现Python的编译器包的文档,但注意到它已经在Python 3.0中消失了,没有任何明确的替换或解释.

我似乎无法在python-dev上找到关于如何做出这个决定的讨论 - 有没有人对这个决定有任何见解?

python compiler-construction python-3.x

37
推荐指数
1
解决办法
1万
查看次数

快速评估大量输入值的数学表达式(函数)

以下问题

并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/sf/answers/41600611/来自数据库的20k到30k输入值.我实施了快速而肮脏的基准测试,因此我可以比较不同的解

# Runs with Python 3(.4)
import pprint
import time

# This is what I have
userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
print_results = False

# Some database, represented by an array of dicts (simplified for this example)

database_xy = []
for a in range(1, demo_len, 1):
    database_xy.append({
        'x':float(a),
        'y_eval':0,
        'y_sympya':0,
        'y_sympyb':0,
        'y_sympyc':0,
        'y_aevala':0, …
Run Code Online (Sandbox Code Playgroud)

python eval abstract-syntax-tree sympy numexpr

9
推荐指数
1
解决办法
2902
查看次数

在python Web服务器上执行数学用户代码,最简单的安全方法是什么?

我之前已经意识到这个问题,但是这种情况略有不同.

我想运行一个python图像板(使用web.py),这将允许用户通过提交代码生成新图像.代码将采用单个函数的形式,它采用像素的x,y坐标并返回r,g,b值,例如:

def simpleGradient(xrel,yrel):
    r = xrel*256
    g = yrel*256
    b = 0
    return [r,g,b]
Run Code Online (Sandbox Code Playgroud)

只需要非常小的语法,它不一定是python.使用exec有限的范围似乎太不安全了,使用PyPy或VM似乎不必要地复杂(我对这一切都很新).

而不是沙箱化,是否有一种pythonic方式以更小的语言执行代码?是python的一个子集(解析和白名单?),还是我可以嵌入的数学导向语言?

python security web.py

8
推荐指数
1
解决办法
819
查看次数