classification
Title: `exec` attribute can't be set to objects in Python2 (SyntaxError)
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: ebarry, luav
Priority: normal Keywords:

Created on 2018-05-01 20:32 by luav, last changed 2018-05-01 21:08 by ebarry. This issue is now closed.

Messages (5)
msg316015 - (view) Author: (luav) Date: 2018-05-01 20:32
The following code works fine on Python 3.5.2 but `exec` attribute fails to be set to the object on Python 2.7.12:
```python
>>> o = type('O', (object,), {})
>>> o.e = 1
>>> o.eval = 1
>>> o.exec = 1
  File "<stdin>", line 1
    o.exec = 1
         ^
SyntaxError: invalid syntax
```

OS Environments:  Ubuntu 16.04.4 LTS x64
msg316016 - (view) Author: Emanuel Barry (ebarry) * (Python triager) Date: 2018-05-01 20:34
This is because `exec` is a keyword in Python 2, whereas in Python 3 it's a function.
msg316018 - (view) Author: (luav) Date: 2018-05-01 20:58
Why Python 2 documentation does not outline that keywords / statements can't be used as the object attributes?
https://docs.python.org/2/reference/simple_stmts.html#exec

And why does this restriction exist at all? The keywords always stand-alone and newer follow '.', i.e. always distinguishable from the object attributes.
msg316019 - (view) Author: (luav) Date: 2018-05-01 21:04
I'm sorry for the previous question, now it's clear (the space is allowed after the '.' which complicates the parsing):
```
>>> o.e = 1
>>> o. e
1
>>> o.e
1

```

Anyway, it would be nice to outline the eligible values for attributes in the documentation (https://docs.python.org/2/tutorial/classes.html).
msg316020 - (view) Author: Emanuel Barry (ebarry) * (Python triager) Date: 2018-05-01 21:08
Any valid variable name can be used as a an attribute; for example, "spam" is valid while "spam-eggs" is not. This isn't unique to classes, but to all assignments everywhere. If we allowed `o.exec = blah` then we should also allow `exec = blah` at the global scope and that's a whole load of not happening, much less in Python 2 (which isn't getting any significant updates anymore).
History
Date User Action Args
2018-05-01 21:08:42ebarrysetmessages: + msg316020
2018-05-01 21:04:58luavsetmessages: + msg316019
2018-05-01 20:58:29luavsetmessages: + msg316018
2018-05-01 20:34:08ebarrysetstatus: open -> closed

nosy: + ebarry
messages: + msg316016

resolution: not a bug
stage: resolved
2018-05-01 20:32:55luavcreate