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.sort
是 arr
计算结果的 sort
属性的属性访问表达式;从语义上讲,当 arr
是一个列表时,arr.sort
评估为 arr
的 sort
方法的方法对象,因此它在运行时也完全没问题。
有点像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
有效果,这个检测不到
我一直在尝试使用排序函数对数字数组进行排序,但我忘了写括号。
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.sort
是 arr
计算结果的 sort
属性的属性访问表达式;从语义上讲,当 arr
是一个列表时,arr.sort
评估为 arr
的 sort
方法的方法对象,因此它在运行时也完全没问题。
有点像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
有效果,这个检测不到