我有一个看起来像这样的字符串:
"Name1=Value1;Name2=Value2;Name3=Value3"
Run Code Online (Sandbox Code Playgroud)
Python中是否有一个内置的类/函数来接受该字符串并构造一个字典,就像我这样做了:
dict = {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3"
}
Run Code Online (Sandbox Code Playgroud)
我查看了可用的模块,但似乎找不到匹配的东西.
谢谢,我确实知道如何自己制作相关的代码,但是因为这些小的解决方案通常是我的领域等待发生(即有人写道:Name1 ='Value1 = 2';)等等,所以我通常更喜欢一些预先测试功能.
我会自己做的.
我如何(轻松地)获取一个字符串,例如"sin(x)*x^2"用户可能在运行时输入的字符串,并生成一个可以评估任何值的Python函数x?
我们都知道这eval很危险,即使你隐藏了危险的函数,因为你可以使用Python的内省功能深入挖掘并重新提取它们.例如,即使您删除__builtins__,也可以使用它来检索它们
[c for c in ().__class__.__base__.__subclasses__()
if c.__name__ == 'catch_warnings'][0]()._module.__builtins__
Run Code Online (Sandbox Code Playgroud)
但是,我见过的每个例子都使用属性访问.如果我禁用所有内置函数并禁用属性访问(通过使用Python令牌化程序对输入进行标记,并在具有属性访问令牌时拒绝它),该怎么办?
在你问之前,不,对于我的用例,我不需要其中任何一个,所以它不会太瘫痪.
我想要做的是让SymPy的同情功能更安全.目前,它对输入进行了标记,对其进行了一些转换,并在命名空间中对其进行了演绎.但它不安全,因为它允许属性访问(即使它真的不需要它).
假设我有一个标准的Python字符串(例如从中获取的字符串raw_input()),可能"2 + 2"是为了简单起见.
我想将这个字符串转换为Python中的标准数学运算,这样"2 + 2"就会返回4.
有没有一种简单的方法可以做到这一点,或者我是否必须拆分空格并手动解析每个数字/符号,然后根据我发现的数据进行数学运算?
我想要正则表达式吗?
我目前教大学一年级学生python,我很惊讶地发现,input我的一些学生已经决定使用(并且被奇怪的行为搞糊涂了)看似无害的功能,正在隐藏eval它背后的电话.
所以我的问题是,input函数调用的原因是eval什么,以及这对哪些函数更有用raw_input呢?我知道Python 3已经改变了,但它首先似乎是一个不寻常的设计决定.
我有一个网站,用户输入数学方程式(表达式),然后根据网站提供的数据(常数)评估这些方程式.所需的数学运算,包括符号,算术运算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的数学表达式解析器+评估器?
我不是第一个提出这个问题的人,但答案通常指向eval().例如,人们可以这样做:
>>> safe_list = ['math','acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'abs']
>>> safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
>>> s = "2+3"
>>> eval(s, {"__builtins__":None}, safe_dict)
5
Run Code Online (Sandbox Code Playgroud)
但这不安全:
>>> s_badbaduser = """
... (lambda fc=(
... lambda n: [
... c for c in
... ().__class__.__bases__[0].__subclasses__()
... if c.__name__ …Run Code Online (Sandbox Code Playgroud) 以下问题
并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/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) 我有一个关于在字符串中评估数学表达式的问题.例如我的字符串如下:
my_str='I have 6 * (2 + 3) apples'
Run Code Online (Sandbox Code Playgroud)
我想知道如何评估此字符串并获得以下结果:
'I have 30 apples'
Run Code Online (Sandbox Code Playgroud)
这有什么办法吗?
提前致谢.
eval在这种情况下,PS python的功能无济于事.当尝试使用该eval函数进行评估时,它引发了错误.
我们知道Python eval()是邪恶的
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
StackOverflow中的线程和线程建议使用SymPy evalf().
作为一个Python新手,我无法真正说服自己,evalf()因为我缺乏技能是安全的.任何人都可以详细说明evalf()(不同)的内容吗?
python ×10
eval ×5
string ×3
math ×2
dictionary ×1
equation ×1
expression ×1
numexpr ×1
parsing ×1
python-2.x ×1
sandbox ×1
split ×1
sympy ×1
user-input ×1