如何警告潜在的NameError?

时间:2012-08-23 17:24:21

标签: python nameerror

以下是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甚至是警告。

如何在运行时通知我?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

使用Pylint:

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'

答案 2 :(得分:0)

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