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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top