kwa*_*ord 14 python warnings cython
在Cython中,通常的raise关键字会发出C代码,其中包含对Cython源文件的行和名称的引用,从而允许生成有用的错误消息.
但是,我没有看到任何警告.简单的呼叫warnings.warn让解释者对警告的来源感到困惑.我可以使用,PyErr_WarnExplicit如果有类似于__LINE__宏的pyx文件.
是否有标准方式发出警告或标准方式来引用Cython中的pyx行号?
这个问题已经开放了几个月,所以我只能假设Cython目前没有好的方法来发出警告.我会在这里打开它,以防有人确实找到方法/提交补丁以使其正常工作.
这是可以正常工作的东西
警告.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 函数可用于覆盖确定源文件和行号的默认方法。