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
i开发者_运维问答f 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.
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.
精彩评论