因为if是一个关键字。您对o.while和o.for也存在类似问题:
pax> python
>>> class C(object): pass
...
>>> o = C()
>>> o.not_a_keyword = 123
>>> o.if = 123
File "", line 1
o.if = 123
^
SyntaxError: invalid syntax
>>> o.while = 123
File "", line 1
o.while = 123
^
SyntaxError: invalid syntax
>>> o.for = 123
File "", line 1
o.for = 123
^
SyntaxError: invalid syntaxPython中的其他关键字可通过以下方式获得:
>>> 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];可以(有点困难)根据这些词汇元素出现的位置(以及它们两侧存在的内容)使用复杂的解析器进行评估。但是,(至少部分地)为了简单(和可读性),这没有做到。