发出Cythonic警告?

kwa*_*ord 14 python warnings cython

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

但是,我没有看到任何警告.简单的呼叫warnings.warn让解释者对警告的来源感到困惑.我可以使用,PyErr_WarnExplicit如果有类似于__LINE__宏的pyx文件.

是否有标准方式发出警告或标准方式来引用Cython中的pyx行号?

更新

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

Geo*_*edy 4

这是可以正常工作的东西

警告.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__)
Run Code Online (Sandbox Code Playgroud)

设置.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
)
Run Code Online (Sandbox Code Playgroud)

技巧是让 cython#line在生成 C 代码时发出指令,并欺骗它认为 和__FILE____LINE__它可以使用的真实变量。然后,警告中的 warn_explicit 函数可用于覆盖确定源文件和行号的默认方法。