- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
请注意:这与 eval() 的使用无关,它与使用和教授它的书籍的潜在质量(或缺乏质量)有关。所以在 Python 中已经有无数关于 eval() 的线程。
冒着招致 SO 愤怒和反对票的风险,我还是决定问这个问题,以防万一。请多多包涵。我已经针对这个特定问题尝试了 Google 和 SO 本身(如您所见)但一无所获。不过我可能是个瞎子。
这个问题是关于臭名昭著的 eval() 函数的使用。
约翰·泽尔 (John Zelle) 有一本相对知名(如您所见,评论也很详尽)的书:http://www.amazon.com/Python-Programming-Introduction-Computer-Science/dp/1590282418/ref=pd_sim_b_3
从技术上讲,这是一本使用 Python 作为编程语言的 CS1 书籍。很公平,这减轻了作者的一些责任(“嘿,我想在这里教你一些广泛的东西,而不是所有这些语法和安全细节”),但当我开始阅读它时,我注意到,从字面上看第一个例子,使用
x = eval(input("请输入您的号码:"))
其中 x 应该是一个 int,因此我们需要将用户输入转换为一个 int。
我使用的是 Python 2.7.4,而这本书是关于 Python 3 的,所以我从一开始就在 print() 和 input() 以及 eval() 方面遇到了很多问题,不得不做一些研究使示例起作用。在我的研究过程中,我已经阅读了无数关于 Python 中的 eval() 的观点(主要是在 SO 上),归结为它几乎总是不好的、安全风险、不必要的技术开销等等。用户的问题要详细得多(有一个关于在做 wxPython 项目时使用 eval() 的问题),所以我不能保证我的案例和他们的案例完全相似,但仍然......
所以,我承认,我对这本书的了解并不太深,但我已经到了这样的地步,稍后,作者解释了 eval() 的用法,但没有提及其有争议的性质。他基本上说了我刚才说的话:我们需要 x 最终成为一个 int,所以这里有一个方便的方法来做到这一点。从那以后他似乎一直在使用它。
我的问题是:如果作者从一开始就犯了这样的错误(或者这不是错误?我可能在这里遗漏了什么),这本书值得学习吗?我相信 Zelle 先生是一位伟大的 CS 老师,这表明,但无论他是否愿意,除了算法和编程艺术之外,人们仍然会从他的书中学习 Python。因此,值得从一本对 Python 社区中看似普遍的问题保持沉默的书中学习 Python 吗?我不希望 Zelle 先生成为一名 Python 黑客并揭开它的所有 secret ,但像这样的小细节可以成就或毁掉一个自学/自学的人。对于本学习 Material ,您有何建议?
附言另一方面,让我从一开始就(不知不觉地)做相当多的研究和实验是非常酷的 :-)
谢谢!
最佳答案
作为相关书籍的作者,让我来权衡一下这个问题。
书中对 eval 的使用在很大程度上是从 Python 2 到 Python 3 转换的历史产物(尽管在 Python 2 中使用 input 也存在同样的“缺陷”)。我很清楚在生产代码中使用 eval 的危险,因为输入可能来自不受信任的源,但是这本书不是关于基于 Web 系统的生产代码;这是关于学习一些 CS 和编程原理。书中确实没有任何内容可以远程视为生产代码。我的目标始终是使用最简单的方法来说明我要表达的观点,而 eval 有助于做到这一点。
我不同意人群在所有情况下都宣称 eval evil。对于仅由其作者运行的简单程序和脚本来说,它非常方便。在这种情况下,它是绝对安全的。它允许简单的多个输入和表达式作为输入。在教学上,它强调表达式评估的概念。 Eval 暴露了解释型语言的所有力量(和危险)。我一直在自己的个人程序中使用 eval(不仅仅是在 Python 中)。事后看来,我完全同意我应该包括一些对 eval 潜在风险的讨论;无论如何,这是我在类里面经常做的事情。
最重要的是,可以通过多种方式改进本书(总是有)。我不认为使用 eval 是一个致命的缺陷;它适合所展示的节目类型以及这些节目出现的背景。我不知道本书中使用 Python 的方式有任何其他“不安全性”,但您应该被警告(正如前言所解释的那样)有很多地方的代码并不完全是“Pythonic”。
关于Python - Zelle 书中使用了 eval(),这是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15995787/
渲染此 mandelbrot 集仅需 100 次迭代就需要一个多小时,而渲染 10,000 次迭代则需要 10 个小时。有没有办法让它更快: from graphics import * width
我正在模拟交通灯和汽车。当灯变绿时,汽车应该移动。 (我知道实际的红绿灯不会从绿色跳到红色,或从红色跳到黄色,但是......就这样吧)。该程序接受用户的输入,确定红绿灯应该循环多长时间;它首先保持红
我试图找出为什么我的一个函数中的 while 循环仍在运行,即使在我的图形中的点相等之后,也就是我将其设置为停止时。我做错了什么吗?我试图改变其他事情来让它工作但没有运气。这是一个游戏——当角色到达终
请注意:这与 eval() 的使用无关,它与使用和教授它的书籍的潜在质量(或缺乏质量)有关。所以在 Python 中已经有无数关于 eval() 的线程。 冒着招致 SO 愤怒和反对票的风险,我还是决
我想制作一个简单的程序来提高我对此类编程的了解。我发现了一个非常有用的库 pyeasyGA,并通过它我尝试使用graphics.py 制作一个简单的程序,该程序从随机生成的“pass”序列中创建一个收
我是 Java 新手,我只是想得到一些简单的东西,可能类似于 Zelle's graphics对于Python。 最佳答案 Java 类 Graphics和 Graphics2D应该包含 Zelle
该程序似乎有效,但是创建的线性回归线似乎并不是真正的最佳拟合线。 我认为问题在于方程的实现。我不确定我的解释是否正确,我也不确定我是否在做练习最后一段应该做的事情。 这是图形库:http://mcsp
由于我在尝试使用 J Zelle 教授的graphics.py 通过屏幕窗口输入信息时遇到一些问题,我正在阅读一些关于“http://anh.cs.luc.edu/python/hands-on/3.
我是一名优秀的程序员,十分优秀!