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程序,这些程序在执行之前很难确定它将使用多少内存.因此,我有时会调用一个试图分配大量RAM的Python程序,导致内核大量交换并降低其他正在运行的进程的性能.
因此,我希望限制Python堆可以增加多少内存.达到限制时,程序可能会崩溃.最好的方法是什么?
如果重要,很多代码都是用Cython编写的,所以它应该考虑那里分配的内存.我没有与纯Python解决方案结合(它不需要是可移植的),所以在Linux上运行的任何东西都可以.
我有一个网站,用户输入数学方程式(表达式),然后根据网站提供的数据(常数)评估这些方程式.所需的数学运算,包括符号,算术运算min()
,max()
以及其他一些基本功能.一个示例等式可以是:
max(a * b + 100, a / b - 200)
Run Code Online (Sandbox Code Playgroud)
人们可以简单地eval()
使用Python,但我们都知道这会导致网站泄露.进行数学方程式评估的安全方法是什么?
Python有什么数学方程式解析和评估引擎
如果选择使用Python本身来评估表达式,那么任何Python沙箱都会限制Python,因此只有用户供应商操作符和函数可用.完全成熟的Python,如定义函数,应该完全禁用.子流程是可以的(参见PyPy沙箱).特别是,应该关闭用于利用内存和CPU使用的循环和其他漏洞.
任何其他方法,例如使用命令行二进制(bc)?
可能重复:
Python函数调用超时
我想实现当函数花了超过90秒完成时它应该在超时时立即返回.有没有办法实现这一目标?
def abc(string):
import re
if re.match('some_pattern', string):
return True
else:
return False
abc('some string to match')
Run Code Online (Sandbox Code Playgroud)
编辑
请下载此测试文件.我创建了一个线程类,并在发生超时错误时在线程内引发异常.但线程仍然存在,因为它i am still alive :)
甚至在异常后打印.为什么异常不会强制线程停止?
我有一个用户输入功能的程序,例如sin(x)+1
.我正在ast
尝试通过将组件列入白名单来确定字符串是否"安全",如本答案中所示.现在我想解析字符串,*
在没有它们的系数之间添加乘法()符号.
例如:
3x
- > 3*x
4(x+5)
- > 4*(x+5)
sin(3x)(4)
- > sin(3x)*(4)
(sin
已经在全局变量中,否则这将是s*i*n*(3x)*(4)
有没有有效的算法来实现这一目标?我更喜欢pythonic解决方案(即不是复杂的正则表达式,不是因为它们是pythonic,而是因为我不理解它们并想要一个我能理解的解决方案.简单的正则表达式是可以的.)
sympy
在一个条件下,我非常愿意使用(这对于这类事情看起来很容易):安全.显然是在引擎盖下sympy
使用eval
.我目前的(部分)解决方案的安全性非常好.如果有人有办法sympy
使用不受信任的输入更安全,我也欢迎这一点.
以下问题
并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/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图像板(使用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中的函数参数中传递一个公式,其中公式是其他函数参数的组合.原则上,这将是这样的:
myfunction(x=2,y=2,z=1,formula="x+2*y/z")
6
Run Code Online (Sandbox Code Playgroud)
或更具体:
def myformula(x,y,z,formula):
return formula(x,y,z)
Run Code Online (Sandbox Code Playgroud)
这将允许用户根据x,y和z选择任何算术表达式,而无需创建新函数.
我预见的一种可能性是在函数内的代码行中转换字符串.在Python中有什么可能吗?还是其他任何想法?谢谢
我正在编写一个程序,其中将方程式作为字符串输入,然后求值。到目前为止,我已经提出了:
test_24_string = str(input("Enter your answer: "))
test_24 = eval(test_24_string)
Run Code Online (Sandbox Code Playgroud)
我既需要此方程式的字符串版本,也需要评估的版本。但是,这eval
是非常危险的功能。int()
但是,使用不起作用,因为这是一个方程式。是否存在一个Python函数,该函数将评估字符串中的数学表达式,就像输入数字一样?