Python 未检测到语法错误

Python doesn't detect syntax error

我一直在尝试使用排序函数对数字数组进行排序,但我忘了写括号。

arr.sort

而不是

arr.sort()

我的问题是为什么 python 不能像 Java 那样检测到这个错误并通知我? 程序一直编译正常,但因为我是按升序输入数字,所以问题不会出现。

因为这不是错误。

当您不包含 () 时,不会调用函数(或方法)。取而代之的是 returns 函数。

示例:

>>> str.encode
<method 'encode' of 'str' objects>

实际操作中:

import tkinter as tk

def hello():
    print('hello')

tk.Frame()
a = tk.button(text="Press", command=hello)
a.pack()
tk.mainloop()

现在,如果您尝试使用 command=hello(),那么它会在您实际按下按钮的情况下调用函数。

arr.sort 在语法上是有效的。这不是您想要的语法。从语法上讲,arr.sortarr 计算结果的 sort 属性的属性访问表达式;从语义上讲,当 arr 是一个列表时,arr.sort 评估为 arrsort 方法的方法对象,因此它在运行时也完全没问题。

有点像Java中的method references,但是由于Python是动态类型的,有方法对象,所以不需要遍历所有的函数接口和poly表达式内容 Java 8 必须添加以支持 list::sort 语法。

语法错误仅针对完全无效的语法。

之所以Python检测不到这种类型的错误是因为Python是动态类型的,而Java是静态类型的。

当您说 a = arr.sort 时,python 将函数分配给 a。现在你可以做 a(),它会 运行 arr.sort。在 Python 中这是一件完全有效的事情,因为我们没有提前告诉它 a 应该是什么,所以它不知道你是否想让 a 成为函数或排序列表...它只是相信您知道自己在做什么。

另一方面,

Java 是静态类型的:您提前告诉它 a 应该是什么。因此,当您不小心遗漏了括号时,它会显示 "that's a function, not a list like you said it would be".


如果你使用像 PyCharm 这样的 IDE,它会告诉你很多这样的警告:

self.function 显示:

Statement seems to have no effect and can be replaced with function call to have an effect

但是我们分配它的那一刻:

a = self.function有效果,这个检测不到