eval函数是一种动态生成代码的强大而简单的方法,那么有什么警告呢?
我一直在寻找的Python代码动态评估,并遇到了eval()和compile()功能,以及exec声明.
有人可以解释之间的区别eval和exec怎样的不同模式,compile()适应吗?
在我正在阅读Python的书中,它继续使用代码 eval(input('blah'))
我阅读了文档,我理解它,但我仍然没有看到它如何改变input()功能.
它有什么作用?谁能解释一下?
我很想知道R是否可以使用它的eval()功能来执行例如字符串提供的计算.
这是一个常见的情况:
eval("5+5")
Run Code Online (Sandbox Code Playgroud)
但是,而不是10我得到:
[1] "5+5"
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.
但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).
那么,什么时候可以使用它?
我有一些代码的情况,eval()作为一种可能的解决方案.现在我从来没有使用eval()过,但是,我已经发现了很多关于它可能造成的潜在危险的信息.也就是说,我对使用它非常谨慎.
我的情况是我有一个用户给出的输入:
datamap = raw_input('Provide some data here: ')
Run Code Online (Sandbox Code Playgroud)
哪里datamap需要是字典.我四处搜索,发现eval()可以解决这个问题.我认为在尝试使用数据之前我可以检查输入的类型,这将是一个可行的安全预防措施.
datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
return
Run Code Online (Sandbox Code Playgroud)
我仔细阅读了文档,但我仍然不清楚这是否安全.eval在输入或datamap调用变量后立即评估数据吗?
该ast模块是.literal_eval()唯一安全的选择吗?
阅读了bash手册页和关于这篇文章.
我仍然无法理解eval命令究竟是什么以及它的典型用途.例如,如果我们这样做:
bash$ set -- one two three # sets $1 $2 $3
bash$ echo $1
one
bash$ n=1
bash$ echo ${$n} ## First attempt to echo $1 using brackets fails
bash: ${$n}: bad substitution
bash$ echo $($n) ## Second attempt to echo $1 using parentheses fails
bash: 1: command not found
bash$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeeds
one
Run Code Online (Sandbox Code Playgroud)
这里究竟发生了什么,美元符号和反斜杠如何与问题相关联?
我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval?
例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.
有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).
我有一个像下面这样的字符串:
String str = "4*5";
Run Code Online (Sandbox Code Playgroud)
现在我必须20通过使用字符串来获得结果.
我知道在其他一些语言中,这个eval()功能会做到这一点.我怎么能用Java做到这一点?
虽然[] + []是一个空字符串,[] + {}是"[object Object]",{} + []是0.为什么是{} + {}NaN?
> {} + {}
NaN
Run Code Online (Sandbox Code Playgroud)
我的问题是不是为什么({} + {}).toString()是"[object Object][object Object]"同时NaN.toString()的"NaN",这部分在这里有一个答案已经.
我的问题是为什么这只发生在客户端?在服务器端(Node.js){} + {}是"[object Object][object Object]".
> {} + {}
'[object Object][object Object]'
Run Code Online (Sandbox Code Playgroud)
总结:
在客户端:
[] + [] // Returns ""
[] + {} // Returns "[object Object]"
{} + [] // …Run Code Online (Sandbox Code Playgroud) javascript eval node.js web-developer-toolbar google-chrome-devtools