Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Emitting Cythonic warnings?

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.

like image 795
kwatford Avatar asked Apr 15 '10 16:04

kwatford


People also ask

What does the term Chthonian or chthonic mean?

chthonic \THAH-nik\ adjective. : of or relating to the underworld : infernal.

What does chthonic mean mythology?

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.

Which Greek gods are chthonic?

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.

How did one normally offer sacrifice to a chthonic deity in ancient Greece?

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.


1 Answers

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.

like image 95
Geoff Reedy Avatar answered Sep 28 '22 19:09

Geoff Reedy