Почему интерпретатор Python не возвращает явное сообщение SyntaxError? - PullRequest
2 голосов
/ 08 июля 2019

Если посмотреть на CPython tokenizer.c, токенайзер возвращает определенные сообщения об ошибках.

В качестве примера вы можете взглянуть на часть, в которой токенизатор пытается разобрать десятичное число . При попытке анализа числа 5_6 все должно быть в порядке, но при попытке анализа числа 5__6 токенизатор должен вернуть ошибку SyntaxError с сообщением «недопустимый десятичный литерал»:

static int
tok_decimal_tail(struct tok_state *tok)
{
    int c;

    while (1) {
        do {
            c = tok_nextc(tok);
        } while (isdigit(c));
        if (c != '_') {
            break;
        }
        c = tok_nextc(tok);
        if (!isdigit(c)) {
            tok_backup(tok, c);
            syntaxerror(tok, "invalid decimal literal");
            return 0;
        }
    }
    return c;
}

Используя Python, я попытался дозвониться до сообщения SyntaxError токенизатора:

In [12]: try: 
    ...:     eval('5__6') 
    ...: except SyntaxError as e: 
    ...:     print(e.args, e.filename, e.lineno, e.msg, e.text) 

('invalid token', ('<string>', 1, 2, '5__6')) <string> 1 invalid token 5__6

Есть ли способ извлечь сообщение SyntaxError из токенизатора?

1 Ответ

7 голосов
/ 11 июля 2019

Вы просматриваете исходный код, который присутствует только в Python 3.8a1 и новее, см. Запрос на , который представил это сообщение в июле 2018 :

bpo-33305: улучшена ошибка синтаксиса для недопустимых числовых литералов. (GH-6517)

и прилагаемый выпуск Python # 33305 .

Когда я запускаю ваш код с Python 3.8b2 (текущая бета), я вижу сообщение, которое вы ожидали:

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=8, micro=0, releaselevel='beta', serial=2)    
>>> try:
...     eval('5__6')
... except SyntaxError as e:
...     print(e.args, e.filename, e.lineno, e.msg, e.text)
...
('invalid decimal literal',) <string> 1 invalid decimal literal None

Вы пробовали это на Python 3.7 или более ранней версии, поэтому пока не увидите новые сообщения.

...