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?
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.
chthonic \THAH-nik\ adjective. : of or relating to the underworld : infernal.
chthonic, of or relating to earth, particularly the Underworld. Chthonic figures in Greek mythology included Hades and Persephone, the rulers of the Underworld, and the various heroes venerated after death; even Zeus, the king of the sky, had earthly associations and was venerated as Zeus Chthonius.
The chthonic gods in Ancient Greece resided in or were associated with the underworld and the dead. The most prominent chthonic gods were Hades, Persephone, Demeter, and Hecate, and they were all intertwined in the myth of the abduction of Persephone and the Eleusinian Mysteries.
Chthonic sacrifice was commonly defined by offering a black or dark-hided animal to the deity. Worshippers did not consume the sacrifice themselves, but instead burned the entirety of the animal for the god.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With