Издают цитонические предупреждения? - PullRequest
14 голосов
/ 15 апреля 2010

В Cython обычное ключевое слово raise испускает код C, который содержит ссылку на строку и имя исходного файла Cython, позволяя создать полезное сообщение об ошибке.

Однако я ничего не видел для предупреждений. Простой вызов warnings.warn оставляет переводчика в замешательстве относительно того, откуда пришло предупреждение. Я мог бы использовать PyErr_WarnExplicit, если было что-то похожее на макрос __LINE__ для файлов pyx.

Существует ли стандартный способ выдачи предупреждений или стандартный способ ссылки на номер строки pyx в Cython?

Обновление

Этот вопрос был открыт в течение нескольких месяцев, поэтому я могу только предположить, что в настоящее время у Cython нет хорошего способа выдачи предупреждений. Я оставлю это открытым здесь на случай, если кто-то найдет способ / отправит патч, чтобы сделать эту работу правильной.

1 Ответ

3 голосов
/ 25 июня 2010

Вот то, что работает хорошо

warn.pyx:

import warnings

cdef extern from "Python.h":
    char* __FILE__

cdef extern from "Python.h":
    int __LINE__

def dowarn():
    warnings.warn_explicit("a warning", category=UserWarning, filename=__FILE__, lineno=__LINE__)

setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Compiler.Main import default_options
default_options['emit_linenums'] = True
from Cython.Distutils import build_ext


ext_modules = [ Extension("warn", ["warn.pyx"]) ]

setup(
        name = "warn",
        cmdclass = {"build_ext": build_ext},
        ext_modules = ext_modules
)

Хитрость заключается в том, чтобы заставить генерировать директивы cython #line при генерации кода C и заставить его думать, что __FILE__ и __LINE__ - реальные переменные, которые он может использовать. Затем можно использовать функцию warn_explicit из предупреждений, чтобы переопределить метод определения исходного файла и номера строки по умолчанию.

...