发出Cythonic警告?

时间:2010-04-15 16:26:37

标签: python warnings cython

在Cython中,通常的raise关键字会发出C代码,其中包含对Cython源文件的行和名称的引用,从而允许生成有用的错误消息。

但是,我没有看到任何警告。简单地调用warnings.warn会使解释器对警告的来源感到困惑。如果有与pyx文件的PyErr_WarnExplicit宏类似的内容,我可以使用__LINE__

是否有发布警告的标准方法或在Cython中引用pyx行号的标准方法?

更新

这个问题已经开放了几个月,所以我只能假设Cython目前没有好的方法来发出警告。我会在这里打开它,以防有人确实找到方法/提交补丁以使其正常工作。

1 个答案:

答案 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函数可用于覆盖确定源文件和行号的默认方法。