在Python中使用eval()时如何避免对未使用的局部变量发出警告

时间:2018-08-10 03:19:58

标签: python eval

我有一个函数接受输入参数来求解或获取表达式作为输出以打印到文本文件中。

在函数本身中,我有很多分配的局部变量要在表达式中使用,并使用eval()来求解表达式。所有表达式均以字符串格式给出。这样做的原因是避免键入两次复杂的表达式(解决并打印为输出)

是否有更好的方法来实现此目的,以避免对所有分配的变量发出“已分配局部变量但从未使用过”的警告?

谢谢。

1 个答案:

答案 0 :(得分:0)

Python不会向您发出此警告;一些棉绒或其他静态分析仪,因为您正在做一些不寻常的事情。

现在,您知道,您正在做一些异常的事情,您的静态分析器无法理解并且将要抱怨。如果您知道并且仍然想要这样做,那么正确的做法就是告诉分析器跳过该代码,或者跳过对它的某些检查。

但是,当然每个分析器都有其自己的方式,并且如果您不告诉我们您使用的是哪一个,甚至没有给出完整的信息,以便我们至少可以搜索或猜测,就不可能告诉您什么解决您想要的。但是,如果您浏览了所有使用文档,那么应该很容易找到它。

仅作为示例,如果您使用flake8作为pyflakes的包装,并且警告是pyflakes F841,则可以添加# noqa: F841注释进入违规行以静默警告。如果您觉得不够明显,还可以添加一条注释,以解释您的变量似乎未使用,但实际上已在eval中使用;足以让任何读者(甚至是您,从现在起六个月,当您完全忘记了此代码,但必须对其进行调试)都像flake8一样开心。


另一种替代方法是使用一个表示方程式的对象,该对象知道如何将其表示为字符串,如何计算给定变量值的值,以及与数学运算符一起使用时如何建立新对象

有一个很棒的图书馆,名为SymPy,可以完成所有这些甚至更多工作。您需要稍微重新组织代码才能完成此工作,将xy定义为SymPy变量,并通过将这些变量的替换值传递给方程式进行数值评估,而不是使它们成为普通的Python数字。但是,如果这符合您的需要,则对您的方程式使用SymPy方程式可能比使用字符串更好。

这也将使您的小子高兴,因为您现在正在根据x + y之类的东西来构造方程式,该东西显然使用变量,而不是像'x + y', which only use them indirectly by being passed to eval这样的字符串`。