【问题标题】:Python builds ok even with typos in the code?即使代码中有拼写错误,Python 也能正常构建?
【发布时间】:2011-05-26 15:05:52
【问题描述】:

(注意:我是 Python 新手)

我在函数调用中出现拼写错误,项目已构建,但在运行时因拼写错误触发函数调用而崩溃。

这正常吗?!构建不应该失败吗?我的设置正确吗?!

我在 Linux Centos 上使用 Eclipse。

Eclipse 确实检测到其他错误(缩进、未定义变量(即如果 foo:、之前从未声明过 foo 会导致构建错误等)

这是我的东西的样子:

def foo(self):
   pass

def bar(self):
   foe() 

-> foe 而不是 foo -> 不会产生编译错误,但(当然)会在运行时崩溃

我可以理解 Python 有时在运行时之前不知道变量的类型,但是当我调用一个在类中甚至不存在的函数时它不能检测到它吗??!!

我希望我的设置有很大的错误,否则,我恐怕会错过 Java、C 和所有其他静态类型语言;))))

【问题讨论】:

  • 如果您想要静态,请使用静态语言。 Python 是完全动态的,这是后果之一。但是,您不应该因此而扔毛巾。我的意思是,无数人设法编写工作 Python 代码,而且他们至少不比使用静态语言工作的人更有效率。只要花点时间习惯这些优势,您可能会发现它们超过(或至少收支平衡)功能动态性成本。
  • 如果这两个函数在一个类中。 foe() 应该用 self.foe() 调用。如果你已经设置了 PyDev 插件。它应该被标记为错误。

标签: python eclipse


【解决方案1】:

实际上 PyLint 会检测到这一点,因此如果您使用带有 PyDev 插件的 Eclipse,它会将带有 foe() 的行标记为错误。

PyDev can currently find:

  • 未定义的变量
  • 导入未定义变量
  • 未使用的变量
  • 未使用的导入
  • 未使用的野生进口产品
  • 重复签名
  • 导入重定义
  • 未解决的导入
  • 在类方法中没有声明“self”标记
  • 将缩进与制表符和空格混合使用
  • 缩进错误(缩进时空格数不正确)。

【讨论】:

  • @sje397: 有时,但你可以添加 pylint 评论
  • 我会查一下 - 听起来很有用。
【解决方案2】:

不,它无法检测到。

它是动态的和解释的。您实际上可以在运行时向类添加函数 - 或导入模块 - 因此它无法轻松检测函数是否存在。

【讨论】:

    【解决方案3】:

    Python 不是“构建”的,就像 C 一样。函数可以在 Python 中动态创建。将def foo(): 视为在函数表中添加条目foo。当你调用一个函数时,Python 在表中查找该函数名。如果它不存在,则会出现运行时错误。这是设计使然。您仍然会收到错误消息,尽管它们会在实际调用未知函数时出现。

    【讨论】:

      【解决方案4】:

      在您运行程序之前,Python 不会编译。所以很难说“编译时”。

      【讨论】:

      • 它从来没有被编译过,是的,存在 Python 的 JIT 版本(主要的 CPython 实现也是 JIT),但语言中并不能保证这一点。
      • @nightcracker:你在 1.5 行中弄错了两个重要的事实,恭喜! (1) CPython 没有 JIT 编译器,它是一个普通的旧字节码解释器(例如,它解释将 Python 源代码编译成的字节码)。 (2) 几乎所有 all 实现在开始运行之前都会编译。 Python 语言需要在运行前至少进行一些分析,例如确定名称是指本地名称还是全局名称 - print x; x = 0 在语义上与 print x 不同,但在同一范围内没有分配给 x
      【解决方案5】:

      您必须使用第三方工具来检查所谓的编译错误。看看这个question (and answers)PyCheckerPyLint

      【讨论】:

      • 非常感谢大家!很好的帮助!
      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2018-01-10
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多