1

下面是一个 Python 脚本示例:

n, dollar, euro = map(input().split())
if n == 1:
   print(dolar / euro)  # Note the typo, 'dolar' vs. 'dollar'
else:
   print(euro / dollar)

我犯了一个错误(“dolar”带有一个“l”)。除非您输入 ,否则解释器不会通知error(NameError)甚至警告n = 1

如何在运行时获知这一点?

4

3 回答 3

7

pylint会将此报告为E: 3: Undefined variable 'dolar',并为您提供许多有用的样式提示。

Python 本身不能产生像这样的编译时错误,因为它不能真正告诉你不是在不运行导致它的代码的情况下动态创建该名称。(即使您碰巧这样做,Pylint 也会认为这是一个错误,这很好,因为如果您编写这样的代码,您应该得到它的低分......)

于 2012-08-23T17:32:17.310 回答
3

使用皮林特:

sucmac:~ ajung$ /tmp/bin/pylint ou.py 
No config file found, using default configuration
************* Module ou
W:  3,0: Bad indentation. Found 3 spaces, expected 4
W:  5,0: Bad indentation. Found 3 spaces, expected 4
C:  1,0: Missing docstring
C:  1,0: Invalid name "n" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  1,3: Invalid name "dollar" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  1,11: Invalid name "euro" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
W:  1,18: Used builtin function 'map'
W:  1,22: Used builtin function 'input'
E:  3,9: Undefined variable 'dolar'
于 2012-08-23T17:32:51.693 回答
0

Python 无法在运行时提前通知您,因为有一些方法可以在该行出现之前将“dolar”插入符号表中,并且 Python 无法检测您是否已经这样做,直到它实际尝试运行该行。正如 Josh Lee 所说,最好的办法是制作一个(至少)测试每一行代码的测试套件。

于 2012-08-23T17:30:50.693 回答