在Cython中,通常的raise
关键字会发出C代码,其中包含对Cython源文件的行和名称的引用,从而允许生成有用的错误消息。
但是,我没有看到任何警告。简单地调用warnings.warn
会使解释器对警告的来源感到困惑。如果有与pyx文件的PyErr_WarnExplicit
宏类似的内容,我可以使用__LINE__
。
是否有发布警告的标准方法或在Cython中引用pyx行号的标准方法?
这个问题已经开放了几个月,所以我只能假设Cython目前没有好的方法来发出警告。我会在这里打开它,以防有人确实找到方法/提交补丁以使其正常工作。
答案 0 :(得分:4)
这是可以正常运作的东西
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
)
诀窍是在生成C代码时让cython发出#line
指令并诱使它认为__FILE__
和__LINE__
是它可以使用的真实变量。然后,警告中的warn_explicit函数可用于覆盖确定源文件和行号的默认方法。