This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Provide more helpful error message when `await` is called inside non-`async` method
Type: Stage: resolved
Components: asyncio, Interpreter Core Versions: Python 3.6, Python 3.5
process
Status: closed Resolution: wont fix
Dependencies: Superseder:
Assigned To: Nosy List: aditya gupta, asvetlov, giampaolo.rodola, gvanrossum, martin.panter, nchammas, pitrou, vstinner, yselivanov
Priority: normal Keywords:

Created on 2016-01-24 02:06 by nchammas, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (5)
msg258879 - (view) Author: Nicholas Chammas (nchammas) * Date: 2016-01-24 02:06
Here is the user interaction:

```python
$ python3
Python 3.5.1 (default, Dec  7 2015, 21:59:10) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def oh_hai():
...     await something()
  File "<stdin>", line 2
    await something()
                  ^
SyntaxError: invalid syntax
```

It would be helpful if Python could tell the user something more specific about _why_ the syntax is invalid. Is that possible?

For example, in the case above, an error message along the following lines would be much more helpful:

```
SyntaxError: Cannot call `await` inside non-`async` method.
```

Without a hint like this, it's too easy to miss the obvious and waste time eye-balling the code, like I did. :-)
msg258989 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-01-27 02:28
According to PEP 492, “await” is still allowed to be an ordinary identifier in non-async functions until Python 3.7. Which means you are still allowed to write

def oh_hai():
    await = "something"

The proposed error message would need to be smart enough to distinguish the two cases.
msg259386 - (view) Author: Nicholas Chammas (nchammas) * Date: 2016-02-02 13:45
Related discussions about providing more helpful syntax error messages:

* http://bugs.python.org/issue1634034
* http://bugs.python.org/issue400734
* http://bugs.python.org/issue20608

From the discussion on issue1634034, it looks like providing better messages in the general case of a syntax error is quite difficult. But perhaps in limited cases like this one we can do better.

Parsers are a bit over my head. Martin, is it difficult to distinguish between `await` as a regular name and `await` as a special token?
msg259434 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-02-02 21:24
I’m not that familiar with the parser either. Maybe I remember a flag or something saying “we are inside an async def function”, which changes “await” from a user identifier into a reserved keyword. But I can’t imagine how that flag will help much with this proposal. The problem I think is “await” is never treated as a reserved keyword when the flag is not set.
msg308813 - (view) Author: Andrew Svetlov (asvetlov) * (Python committer) Date: 2017-12-20 21:01
Nothing to do.
Python parser always report with such text on syntax error, there is nothing special for async/await
History
Date User Action Args
2022-04-11 14:58:26adminsetgithub: 70376
2017-12-20 21:01:36asvetlovsetstatus: open -> closed

nosy: + asvetlov
messages: + msg308813

resolution: wont fix
stage: resolved
2016-02-02 21:24:55martin.pantersetmessages: + msg259434
2016-02-02 13:45:14nchammassetmessages: + msg259386
2016-01-27 02:28:31martin.pantersetnosy: + martin.panter
messages: + msg258989
2016-01-24 10:06:39aditya guptasetnosy: + aditya gupta
2016-01-24 09:53:35SilentGhostsetnosy: + gvanrossum, pitrou, vstinner, giampaolo.rodola, yselivanov
components: + asyncio
2016-01-24 02:06:03nchammascreate