Emissione avvertimenti Cythonic?
Domanda
Nel Cython, la parola chiave emette codice C al solito raise
che contiene un riferimento alla linea e il nome del file sorgente Cython, consentendo un messaggio di errore utile da generare.
Tuttavia, non ho visto nulla per le avvertenze. Semplicemente chiamando foglie warnings.warn
l'interprete confuso su dove l'avvertimento è venuto da. Potrei usare PyErr_WarnExplicit
se ci fosse qualcosa di simile alla macro __LINE__
per i file pissidi.
C'è sia un modo standard per emettere segnalazioni o un modo standard per riferirsi al numero di riga pisside in Cython?
Aggiorna
Questa domanda è stato aperto per mesi, quindi posso solo supporre che Cython non ci permette di avere un buon modo per lanciare un avvertimento. Lascio aperto qui in caso qualcuno non trovare un modo / inviare una patch per rendere questo diritto del lavoro.
Soluzione
è qui qualcosa che funziona 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
)
Il trucco è quello di rendere Cython EMIT #line
direttive durante la generazione del codice C e ingannare in pensare che il __FILE__
e __LINE__
sono variabili reali che esso può utilizzare. Poi la funzione warn_explicit da avvertimenti può essere utilizzato per eseguire l'override del metodo predefinito di determinare il numero di file di origine e di linea.