Python没有';无法检测语法错误
我一直在尝试使用sort函数对一个数字数组进行排序,但我忘了写括号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
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()