Python не обнаруживает синтаксическую ошибку - PullRequest
0 голосов
/ 25 мая 2018

Я пытался отсортировать массив чисел, используя функцию сортировки, но я забыл написать круглые скобки.

arr.sort

вместо

arr.sort()

Мой вопрос: почему можноPython обнаружить эту ошибку и сообщить мне, как Java может?Программа продолжала компилироваться нормально, но, поскольку я вводил числа в порядке возрастания, проблема не появлялась.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

arr.sort является синтаксически действительным.Это просто не тот синтаксис, который вы хотели.Синтаксически, arr.sort является выражением доступа к атрибуту для атрибута sort того, что arr оценивает;семантически, когда arr является списком, arr.sort оценивается как объект метода для arr sort метода, так что он прекрасно работает и во время выполнения.

Это похоже на метод ссылается на в Java, но, поскольку Python динамически типизирован и имеет объекты метода, ему не нужно проходить через весь функциональный интерфейс и много выражений, которые Java 8 пришлось добавить для поддержки синтаксиса list::sort.

Синтаксические ошибки только для прямого неверного синтаксиса.

0 голосов
/ 25 мая 2018

Причина, по которой Python не может обнаружить этот тип ошибки, заключается в том, что Python динамически типизирован, а Java статически типизирован.

Когда вы говорите a = arr.sort, python назначает функцию a.Теперь вы можете сделать a(), и он запустит arr.sort.Это абсолютно допустимая вещь в Python, и, поскольку мы заранее не сообщаем, каким должен быть a, он не может знать, подразумевали ли вы a как функцию или отсортированный список.... он просто верит, что вы знаете, что делаете.

С другой стороны, Java имеет статическую типизацию: вы заранее сообщаете ей, что должно быть a.Поэтому, когда вы случайно пропускаете парены, оно говорит: «Это функция, а не список, как вы сказали, что это будет».


Если вы используете IDE, например PyCharm, он скажет вам многоследующие предупреждения:

self.function показывает:

Кажется, что оператор не имеет никакого эффекта и может быть заменен вызовом функции, чтобы иметь эффект

но в тот момент, когда мы присваиваем его:

a = self.function оно оказывает влияние, и это не может быть обнаружено.

0 голосов
/ 25 мая 2018

Потому что это не ошибка.

Когда вы не включите (), функция (или метод) не вызывается.Вместо этого он возвращает функцию.

Пример:

>>> 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(), то вызовет функциюбез вас на самом деле нажав кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...