Python没有';无法检测语法错误

Python没有';无法检测语法错误,python,syntax-error,error-detection,Python,Syntax Error,Error Detection,我一直在尝试使用sort函数对一个数字数组进行排序,但我忘了写括号 arr.sort 而不是 arr.sort() 我的问题是为什么python不能像Java一样检测到这个错误并通知我? 程序一直编译得很好,但因为我是按升序输入数字的,所以问题不会出现。因为这不是一个错误 如果不包含(),则不会调用函数(或方法)。相反,它返回函数 例如: >>> str.encode <method 'encode' of 'str' objects> 现在,如果您使用com

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

arr.sort
而不是

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

因为这不是一个错误

如果不包含
()
,则不会调用函数(或方法)。相反,它返回函数

例如:

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

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

arr.sort
在语法上是有效的。这不是你想要的语法。在语法上,
arr.sort
sort
属性的属性访问表达式,无论
arr
的计算结果是什么;语义上,当
arr
是一个列表时,
arr.sort
计算为
arr
sort
方法的一个方法对象,因此它在运行时也很好

这有点像Java,但由于Python是动态类型的,并且有方法对象,所以它不需要遍历Java 8为支持
list::sort
语法而添加的所有函数接口和多表达式


语法错误仅适用于完全无效的语法。

Python无法检测此类错误的原因是Python是动态类型的,而Java是静态类型的

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

另一方面,Java是静态类型的:您可以提前告诉它
a
应该是什么。因此,当你不小心遗漏了parens时,它会说“这是一个函数,而不是你所说的列表”


如果您使用像PyCharm这样的IDE,它会告诉您以下警告:

self.function
显示:

语句似乎没有效果,可以用函数调用替换以产生效果

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


a=self.function
它有一个效果,无法检测到。

“它返回类型”-什么?那不是真的。我不认为随机
tkinter
的例子真的给这个答案增加了什么。很好before@chrisz这是因为它添加了一个示例,说明它不是python的语法错误,也不是python的语法错误。arr.sort是一个关于
arr
类型的函数。sort是指向函数sort()定义的对象。在java中,方法没有这种表示形式。如何或何时可以使用方法对象?@ChrisIoannou:您在
arr.sort()
中使用它,与java中不同的是,您为
arr.sort
创建一个方法对象,然后用
()
括号调用它。您还可以将它用于在Java中使用方法引用的大多数事情。
import tkinter as tk

def hello():
    print('hello')

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