views:

288

answers:

1

In Cython, the usual raise keyword emits C code that contains a reference to the line and name of the Cython source file, allowing a useful error message to be generated.

However, I haven't seen anything for warnings. Simply calling warnings.warn leaves the interpreter confused as to where the warning came from. I could use PyErr_WarnExplicit if there was something similar to the __LINE__ macro for pyx files.

Is there either a standard way to issue warnings or a standard way to refer to the pyx line number in Cython?

Update

This question has been open for months, so I can only assume that Cython does not presently have a good way to issue warnings. I'll leave it open here in case someone does find a way/submit a patch to make this work right.

+2  A: 

Here's something that works OK

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
)

The trick is to make cython emit #line directives when generating the C code and tricking it into thinking the __FILE__ and __LINE__ are real variables that it can use. Then the warn_explicit function from warnings can be used to override the default method of determining the source file and line number.

Geoff Reedy
`default_options['emit_linenums']` is what I was looking for, thanks!
kwatford