Потому что if
- это ключевое слово. У вас есть похожие проблемы с o.while
и o.for
:
pax> python
>>> class C(object): pass
...
>>> o = C()
>>> o.not_a_keyword = 123
>>> o.if = 123
File "<stdin>", line 1
o.if = 123
^
SyntaxError: invalid syntax
>>> o.while = 123
File "<stdin>", line 1
o.while = 123
^
SyntaxError: invalid syntax
>>> o.for = 123
File "<stdin>", line 1
o.for = 123
^
SyntaxError: invalid syntax
Другие ключевые слова в Python можно получить с помощью:
>>> import keyword
>>> keyword.kwlist
['and', 'as', 'assert', 'break', 'class', 'continue', 'def',
'del', 'elif', 'else', 'except', 'exec', 'finally', 'for',
'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
'not', 'or', 'pass', 'print', 'raise', 'return', 'try',
'while', 'with', 'yield']
Вы должны не , как правило, использовать ключевое слово в качестве имени переменной в Python.
Я бы предложил выбрать более описательное имя, например iface
, если это интерфейс, или infld
для поля ввода и т. Д.
Относительно вашего вопроса отредактируйте , почему ключевые слова не разрешены, это значительно упрощает синтаксические анализаторы, если лексические элементы не зависят от контекста. Необходимость рассматривать лексический токен if
в некоторых местах как ключевое слово, а в других - как идентификатор, привела бы к усложнению, которое на самом деле не нужно, если вы выбираете идентификаторы более разумно.
Например, оператор C ++:
long int int = char[new - int];
можно (с небольшими трудностями) оценить с помощью сложного синтаксического анализатора, основанного на том, где находятся эти лексические элементы (и что существует по обе стороны от них). Но (хотя бы частично) в интересах простоты (и читабельности) это не сделано.