Python不检测语法错误

时间:2018-05-25 20:36:09

标签: python syntax-error error-detection

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

arr.sort

而不是

arr.sort()

我的问题是为什么python不能检测到这个错误并告诉我像Java一样? 该程序保持编译正常,但由于我按升序输入数字,问题不会出现。

3 个答案:

答案 0 :(得分:4)

arr.sort在语法上有效。它只是你想要的语法。从语法上讲,arr.sort是任何sort求值的arr属性的属性访问表达式;从语义上讲,当arr是列表时,arr.sort会计算arr sort方法的方法对象,因此它在运行时完全没问题太

它有点像Java中的method references,但由于Python是动态类型并且有方法对象,因此它不需要遍历所有功能接口和多表达式Java 8必须添加支持list::sort语法。

语法错误仅适用于彻底无效的语法。

答案 1 :(得分:2)

因为这不是错误。

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

示例:

>>> 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()进行尝试,那么它会调用该函数而不会实际按下按钮。

答案 2 :(得分:1)

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

当您说a = arr.sort时,python会将该函数分配给a。现在你可以执行a(),它将运行arr.sort。这在Python中是完全有效的,因为我们不提前告诉它a应该是什么,它不能知道你是否认为a是功能或排序列表...它只是相信你知道你正在做什么。

另一方面,Java是静态类型的:你提前告诉它a应该是什么。因此,当你意外地离开parens时,它会说&#34;这是一个功能,而不是像你说的那样的列表&#34;。

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

self.function显示:

  

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

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

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