There is a restriction on the syntax of attribute access, in Python (at least in the CPython 2.7.2 implementation):
>>> class C(object): pass
>>> o = C()
>>> o.x = 123 # Works
>>> o.if = 123
o.if = 123
^
SyntaxError: invalid syntax
My question is twofold:
o.if = 123
) is forbidden?It would make sense to do o.class = …
, in one of my programs, and I am a little disappointed to not be able to do it (o.class_
would work, but it does not look as simple).
PS: The problem is obviously that if
and class
are Python keywords. The question is why using keywords as attribute names would be forbidden (I don't see any ambiguity in the expression o.class = 123
), and whether this is documented.
Keywords are the reserved words in Python. We cannot use a keyword as a variable name, function name or any other identifier. They are used to define the syntax and structure of the Python language. In Python, keywords are case sensitive.
1 Answer. The correct answer to the question “Which of the following is not a Keyword in Python” is option (a). Val. As Val is not a correct keyword, in Python and all others are keywords.
Yes. Show activity on this post.
id is not a keyword in Python, but it is the name of a built-in function.
Because parser is simpler when keywords are always keywords, and not contextual (e.g. if
is a keyword when on the statement level, but just an identifier when inside an expression — for if
it'd be double hard because of X if C else Y
, and for
is used in list comprehensions and generator expressions).
So the code doesn't even get to the point where there's attribute access, it's simply rejected by the parser, just like incorrect indentation (which is why it's a SyntaxError
, and not AttributeError
or something). It doesn't differentiate whether you use if
as an attribute name, a variable name, a function name, or a type name. It can never be an identifier, simply because parser always assigns it "keyword" label and makes it a different token than identifiers.
It's the same in most languages, and language grammar (+ lexer specification) is the documentation for that. Language spec mentions it explicitly. It also doesn't change in Python 3.
Also, just because you can use setattr
or __dict__
to make an attribute with a reserved name, doesn't mean you should. Don't force yourself/API user to use getattr
instead of natural attribute access. getattr
should be reserved for when access to a variable attribute name is needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With