这篇文章主要围绕使用python的eval和与ast.literal_eval展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python的eval的优缺点,解答与ast.literal_ev
这篇文章主要围绕使用python的eval和与ast.literal_eval展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python的eval的优缺点,解答与ast.literal_eval的相关问题,同时也会为您带来ast.literal_eval用于python中的变量吗?、ast.literal_eval(转)、JavaScript call()和apply()与bind()?、JavaScript的eval()什么时候不是evil?的实用方法。
本文目录一览:- 使用python的eval()与ast.literal_eval()?(python,eval)
- ast.literal_eval用于python中的变量吗?
- ast.literal_eval(转)
- JavaScript call()和apply()与bind()?
- JavaScript的eval()什么时候不是evil?
使用python的eval()与ast.literal_eval()?(python,eval)
我遇到了一些代码,eval()
将其作为可能的解决方案。现在,我从来没有使用eval()
过,但是,我遇到了很多有关它可能引起的潜在危险的信息。也就是说,我对使用它非常谨慎。
我的情况是我有一个用户输入:
datamap = raw_input(''Provide some data here: '')
哪里datamap
需要一本字典。我四处搜寻,发现eval()
可以解决这个问题。我认为我可以在尝试使用数据之前检查输入的类型,这将是可行的安全预防措施。
datamap = eval(raw_input(''Provide some data here: '')if not isinstance(datamap, dict): return
我通读了文档,但仍不清楚这是否安全。eval
是否在输入数据后或datamap
调用变量后立即评估数据?
该ast模块是.literal_eval()
唯一安全的选择吗?
答案1
小编典典169
datamap = eval(raw_input(''Provide some data here: ''))
表示你实际上在认为代码不安全之前对其进行了评估。调用该函数后,它将立即评估代码。另请参阅的危险eval。
ast.literal_eval
如果输入不是有效的Python
数据类型,则会引发异常,因此如果输入无效,则不会执行代码。
使用ast.literal_eval
时,你需要eval
。通常,你不应该评估文字Python语句。
ast.literal_eval用于python中的变量吗?
假设我有一个文件example.py
:import example
VVV = 2
DictionaryNameB = {
'a' : VVV,'bb' : 'SomethingB','c' : False,'ccc' : None,'dddd' : 'true','eeeee' : 0.123456,'f' : 2,'h' : [1,2,3]
}
我写了一个使用的函数ast.literal_eval()
:
def getDicFromFile(self,dic_name):
with open( 'example.py' ) as f:
file_data = f.read()
match = re.findall('%s[^{]+\{[^\}]+\}' % dic_name,file_data,re.MULTILINE)[0]
# print(match)
dicObject = ast.literal_eval(match[len(dic_name)+3:])
return dicObject
我收到错误引发ValueError(’formaled string’); ValueError:格式错误的字符串
我知道ast.literal_eval()
无法解码变量VVV
,还有另一种方法吗?
ast.literal_eval(转)
eval函数在Python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。那么eval和ast.literal_val()的区别是什么呢?本文将大家介绍关于Python中函数eval和ast.literal_eval区别的相关资料,需要的朋友可以参考下。
前言
众所周知在Python中,如果要将字符串型的list,tuple,dict转变成原有的类型呢? 这个时候你自然会想到eval. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:
string <==> list
string <==> tuple
string <==> dict
也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符
串型的输入直接计算。比如,她会将‘1+1‘的计算串直接计算出结果。
从上面来看,eval功能可谓非常强大,即可以做string与list,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串
open(r‘D://filename.txt‘,‘r‘).read()
__import__(‘os‘).system(‘dir‘)
__import__(‘os‘).system(‘rm -rf /etc/*‘)
那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!
所以这里就引出了另外一个安全处理方式ast.literal_eval.可以先看下stackoverflow及Python官方关于这个解释!
stackoverflow
Python官方文档
简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()
函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval()
,都会拒绝执行。
报值错误,不合法的字符串!
而只会执行合法的Python类型,从而大大降低系统的危险性!
所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()
函数!
总结
以上就是Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)的详细内容,更多请关注小编网其它相关文章!
JavaScript call()和apply()与bind()?
如何解决JavaScript call()和apply()与bind()??
.bind()
当你希望稍后在特定上下文中调用该函数时使用,该事件在事件中很有用。当你想立即调用该函数并修改上下文时,请使用.call()
或.apply()
。
调用/应用立即调用该函数,而bind返回一个函数,该函数在以后执行时将具有用于调用原始函数的正确上下文集。这样,你可以在异步回调和事件中维护上下文。
我经常这样做:
function MyObject(element) {
this.elm = element;
element.addEventListener(''click'', this.onClick.bind(this), false);
};
MyObject.prototype.onClick = function(e) {
var t=this; //do something with [t]...
//without bind the context of this function wouldn''t be a MyObject
//instance as you would normally expect.
};
我在Node.js
中将它广泛用于异步回调,我想为其传递成员方法,但仍希望上下文成为启动异步操作的实例。
一个简单,简单的bind实现是:
Function.prototype.bind = function(ctx) {
var fn = this;
return function() {
fn.apply(ctx, arguments);
};
};
它还有更多的功能(就像传递其他args一样),但是你可以阅读更多有关它的内容,并查看MDN上的实际实现。
希望这可以帮助。
解决方法
我已经知道了,apply
并且call
是类似的函数集this
(函数的上下文)。
区别在于我们发送参数的方式(手动vs数组)
题:
但是什么时候应该使用该 bind()
方法?
var obj = {
x: 81,getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
JavaScript的eval()什么时候不是evil?
我正在编写一些JavaScript代码来解析用户输入的功能(用于类似于电子表格的功能)。解析了公式之后,我 可以
将其转换为JavaScript并eval()
在其上运行以产生结果。
但是,eval()
如果能避免,我总是避免使用它,因为它是evil的(而且,无论对与错,我一直认为它在JavaScript中更为evil,因为要评估的代码可能会被用户更改)。
那么,何时可以使用它呢?
答案1
小编典典我想花点时间解决您提出问题的前提-eval()是“ evil”。编程语言人员所用的“ evil”
一词通常表示“危险”,或更确切地说,“使用简单的命令即可造成很多伤害”。那么,什么时候可以使用危险的东西呢?当您知道危险所在以及采取适当的预防措施时。
到目前为止,让我们看一下使用eval()的危险。就像其他所有事物一样,可能存在许多小的隐患,但是性能和代码注入是两个大隐患-eval()被认为是邪恶的原因。
- 性能-eval()运行解释器/编译器。如果您的代码已编译,那么这将是一个很大的成功,因为您需要在运行时中途调用可能很重的编译器。但是,JavaScript仍主要是一种解释性语言,这意味着在一般情况下调用eval()不会对性能造成很大的影响(但请参见下面的我的特别评论)。
- 代码注入-eval()可能以提升的特权运行一串代码。例如,以管理员/超级用户身份运行的程序永远都不想使用eval()用户输入,因为该输入可能是“ rm -rf / etc / important-file”或更糟。同样,浏览器中的JavaScript也不存在此问题,因为该程序无论如何都以用户自己的帐户运行。服务器端JavaScript可能有此问题。
根据您的具体情况。据我了解,您是在自行生成字符串,因此,假设您谨慎地不允许生成“ rm -rf something-
important”之类的字符串,就不会有代码注入的风险(但是请记住,这 非常非常 在一般情况下 很难
确保这一点)。另外,我相信,如果您正在浏览器中运行,则代码注入的风险很小。
至于性能,您必须权衡其易编码性。我认为,如果要解析公式,则最好在解析过程中计算结果,而不是运行另一个解析器(eval()内部的那个)。但是使用eval()进行编码可能会更容易,并且性能下降可能不会引起注意。在这种情况下,eval()看起来比其他任何可以节省您时间的函数都更加evil。
关于使用python的eval和与ast.literal_eval的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于ast.literal_eval用于python中的变量吗?、ast.literal_eval(转)、JavaScript call()和apply()与bind()?、JavaScript的eval()什么时候不是evil?的相关信息,请在本站寻找。
本文标签: