15

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

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

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

更新

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

4

1 回答 1

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__)

设置.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__是它可以使用的真实变量。然后warnings中的warn_explicit函数可以用来覆盖确定源文件和行号的默认方法。

于 2010-06-25T15:20:11.507 回答