1, == (1,) - SyntaxError: неверный синтаксис - PullRequest
0 голосов
/ 31 января 2019
>>> 1, == (1,)
  File "<ipython-input-34-bddb0dd08d2c>", line 1
    1, == (1,)
        ^
SyntaxError: invalid syntax

Почему я получаю SyntaxError?Строка в консоли указывает на оператор сравнения '=='.Я пытался сравнить 2 кортежа.Да, (1,) == (1,) работает.

Это связано с этим ...?

    1,

Out[1]: (1,)
,1
Traceback (most recent call last):
File "<ipython-input-2-d73977cd7b2e>", line 1, in <module>
1("")
TypeError: 'int' object is not callable
def h():
print("hello from h")
h
Out[4]: <function __main__.h>
h()
hello from h
,h
Traceback (most recent call last):
File "<ipython-input-6-89db5d24b531>", line 1, in <module>
h("")
TypeError: h() takes 0 positional arguments but 1 was given
def h(""):
print("hello from h")
File "<ipython-input-7-e4606aaf3740>", line 1
def h(""):
^
SyntaxError: invalid syntax
def h(a):
print("hello from h")
,h
hello from h

Я нахожу это забавным - Python 3.6.3, не происходит на 2.7 или 3.5...

,ord A
Out[112]: 65

Это немного уродливо.Только что попробовал новую IDE - Pycharm с питоном 3.6.3.Консоль выдаёт мне синтаксическую ошибку на ", ord A", а Spyder 3.3.1 - нетЭто как-то связано с IPython?7.2 дает тот же результат для ", ord A" >> 65.

Хорошо, 5 февраля 2019. Кажется, я упал в черную дыру.IPython черная дыра.Похоже, меня смутил другой подъязык IPython, которым пользуется консоль.% Autocall в IPython 'Сделать функции вызываемыми без необходимости вводить круглые скобки'.Хотя установка% Autocall в 0 все еще, кажется, включает это поведение.

1 Ответ

0 голосов
/ 31 января 2019

Это неверный синтаксис.Python видит кортеж с 2 значениями, созданными из выражений 1 и == (1,).Последнее является неполным выражением, поэтому вы получите ошибку только для этой части.

См. Приоритет оператора Таблица , Отображение кортежей естьсамый высокий приоритет, поэтому выражения между запятыми выполняются перед созданием объекта кортежа из результатов.

Так что да, вы можете создавать кортежи только с запятыми, но тогда каждая составная часть должнабыть полным выражением.Вы не можете создать кортеж без использования скобок, если хотите, чтобы кортеж был частью большего выражения.

Это потому, что для любое выражение , которое не использует скобки, но содержитзапятая, запятая будет приводить к созданию кортежа из подвыражений, которые лежат до и после запятой (с частью, следующей после необязательной).Используйте скобки, чтобы изменить то, что Python видит как законченное выражение.Поэтому, если вы хотите сравнить два разных кортежа, вы должны использовать скобки для разделения обоих кортежей, поэтому используйте (1,) == (1,).Как только вы удаляете любой набор скобок, вы создаете один кортеж, содержащий большие выражения (например, (1,) == 1, создает одноэлементный кортеж из теста на равенство (1,) == 1, что приводит к (False,)).

...