Синтаксическая ошибка при определении функции в командной строке Python - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь определить функцию в Python REPL. Каждый раз, когда я пытаюсь запустить приведенный ниже код, я получаю синтаксическую ошибку.

Код:

def hello():
    print ("Hello!")
hello()

Ошибка:

C:\Users\~\Desktop>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def hello():
...     print ("Hello!")
... hello()
  File "<stdin>", line 3
    hello()
        ^
SyntaxError: invalid syntax

Error

Возможное объяснение, с которым я столкнулся в stackoverflow, - это сообщение Ошибка Python: файл "" , где говорится, что я не могу запустить сценарии из интерпретатора Python. Если это правда, то почему это так? То есть если я могу запустить >>> 2 + 2 в окне cmd, почему я не могу запустить функцию 'def'? Надеюсь найти разъяснения по этому вопросу - спасибо!

Редактировать: указать ошибку в тексте, а не только на картинке.

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Если вы хотите понять , почему это происходит, а не просто изучить обходной путь, который работает по какой-то таинственной причине:

Интерактивный режим работает путем чтения, компиляции и выполнения одного оператора за раз. Это очень простое правило - помимо того, что его очень просто реализовать в коде на C, также очень просто работать точно в вашей голове - как только вы это поймете, то есть. Когда у вас есть выбор между реализацией, которую легко объяснить, документировать и проработать в своей голове, или реализацией, которая более сложна, но иногда проще в использовании, Python обычно идет с первой.


Если вы введете простой однострочный оператор, это легко: строка является полным оператором, поэтому она просто компилирует и выполняет эту строку.

Но если вы введете первую строку составного оператора - тот, который имеет : в конце строки, а затем блок с отступом - оператор не будет выполнен, пока вы не напишите блок с отступом, а затем снова не отступите , Таким образом, он печатает специальное приглашение ... вместо >>>, чтобы сообщить вам, что оно продолжает читать то же самое утверждение, и продолжается до тех пор, пока вы не удалите его.

Если вы удалите отступ, набрав пустую строку, оператор готов, поэтому он компилирует и выполняет его, и все хорошо.

Если вы удалили отступ, введя новый однострочный оператор, теперь он имеет два оператора. Если он попытается скомпилировать и запустить его как один оператор, это не удастся.

Кстати, в этом def нет ничего волшебного; то же самое произойдет с любым составным оператором:

>>> for i in range(10):
...     print(i)
... print('Done')

Вы получите то же самое SyntaxError.


Не мог ли Python выяснить, что вы дали ему два оператора, скомпилировать и запускать их один за другим? Да. На самом деле, если вы используете IPython / Jupyter, он действительно делает именно это. Но это усложнит правило, не говоря уже о таких вещах, как обработка исключений в первом утверждении. Python выбирает простое правило, которое вы можете проследить в голове над сложным правилом, хотя сложное правило будет делать то, что вы хотите чаще.


Итак, как это работает в файле модуля? Ну, модули не скомпилированы оператор за один раз, они скомпилированы все сразу, как список операторов, а затем запускаются все сразу. Это, очевидно, не работает для интерактивного терминала, потому что он не может ничего запустить, пока не скомпилирует все, и у него не будет всего, пока не выйдет время.


И последнее: почему продолжают работать выражения?

>>> (1 +
...  2)
3

Выражениям нет дела до отступов. Они заканчиваются, когда все паренсы / скобки / фигурные скобки уравновешены в конце строки, а не тогда, когда следующая строка не смещена. Итак, как только вы введете этот 2), он узнает, что ввод завершен, и может скомпилировать его.

То же самое верно и для продолжения с обратным слешем:

>>> 1 + \
...     2
3

Нет необходимости в незаштрихованной строке; как только вы введете 2 без продолжения с обратной косой чертой, ввод будет завершен.

0 голосов
/ 28 июня 2018

Похоже, вы ввели весь блок как один оператор. Вам нужно будет нажать Enter после ввода:

def hello():
    print ("Hello!")

Чтобы переводчик понимал, что это единственное определение, которое вы ввели. Как только это будет определено, попробуйте запустить функцию hello().

0 голосов
/ 28 июня 2018

Нажмите ввод один раз после определения вашей функции (то есть введите одну пустую строку ). По сути, это позволяет Python знать, что вы закончили определять свою функцию.

Как только вы снова увидите >>>, вы можете вызвать свою функцию.

Посмотрите на картинку, как она должна выглядеть, когда все сделано правильно:

enter image description here

0 голосов
/ 28 июня 2018

Вы должны добавить новую строку между определением функции и ее вызовом:

def hello():
    print ("Hello!")

hello()
...