Python: повысить СинтаксисError с lineno

Я реализую синтаксический анализатор для языка, специфичного для домена, и хочу иметь возможность поднять SyntaxError. Как установить имя файла, lineno и offset при создании этого исключения?

исключение SyntaxError

Поднимается, когда синтаксический анализатор встречает синтаксис ошибка. Это может произойти в инструкции import в выражении exec в вызов встроенной функции eval() или input(), или при чтении начальный script или стандартный ввод (также интерактивно).

Экземпляры этого класса имеют атрибуты filename, lineno, offset и текст для облегчения доступа к деталям. str() экземпляра исключения возвращает только сообщение.

Источник: https://docs.python.org/3.2/library/exceptions.html#SyntaxError

Ответ 1

Ответ:

>>> raise SyntaxError('End quote missing', ("test.py", 1000, 11, "print 'bar"))                                                                             
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 1000
    print 'bar
              ^
SyntaxError: End quote missing

Второй аргумент должен быть 4-кортежем.

Ответ 2

Вы можете посмотреть здесь: https://github.com/python/cpython/blob/master/Objects/exceptions.c#L1273

Я мог бы придумать только это:

import traceback

print("Our exception")

try:
    print("(1)")
    raise SyntaxError('Test2', {'filename': "test.py", 'lineno': 1000, 'offset': 1, 'text': "My text ..."})
except SyntaxError as inst:
    print("(2)")
    print(inst.args)
    print("(3) Get filename %s" % inst.args[1]['filename'])
    print("(4) Traceback")
    traceback.print_tb(inst.__traceback__) 

Вывод:

Our exception
(1)
(2)
('Test2', {'offset': 1, 'filename': 'test.py', 'text': 'My text ...', 'lineno': 1000})
(3) Get filename test.py
(4) Traceback
  File "test.py", line 7, in <module>
    raise SyntaxError('Test2', {'filename': "test.py", 'lineno': 1000, 'offset': 1, 'text': "My text ..."})

Ответ 3

Как насчет:

raise SyntaxError('filename: {}, lineno: {}, offset: {}'.format(
    filename, lineno, offset))