Python 发出电子警告?

Python 发出电子警告?,python,warnings,cython,Python,Warnings,Cython,在Cython中,通常的raise关键字会发出C代码,其中包含对Cython源文件的行和名称的引用,从而生成有用的错误消息 然而,我没有看到任何警告。只需调用warnings.warn就会让解释器对警告的来源感到困惑。如果pyx文件中有类似于\uuuuu行\uuuu宏的内容,我可以使用PyErr\u> 在Cython中是否有发布警告的标准方式或引用pyx行号的标准方式 更新 这个问题已经讨论了好几个月了,所以我只能假设Cython目前没有发布警告的好方法。我会把它放在这里,以防有人找到方法/提交

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

然而,我没有看到任何警告。只需调用
warnings.warn
就会让解释器对警告的来源感到困惑。如果pyx文件中有类似于
\uuuuu行\uuuu
宏的内容,我可以使用
PyErr\u>

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

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

这里有一些可以正常工作的东西

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
指令,并使其认为
uuu文件和
uu line
是它可以使用的实变量。然后,可以使用“警告”中的“警告”显式函数覆盖确定源文件和行号的默认方法。

警告适用于程序用户。为什么他们需要行号?@Tobias-这样当他们向你发送警告信息的输出时,你就可以很容易地看到它是从哪里发出的。此外,使用图书馆的人员通常包括维护(或愿意维护)图书馆的人员。无论用户看到行号是否有用,解释器都会在收到警告时显示行号以及它来自的模块。如果在Cython中使用
warnings.warn
,则报告的模块和行都是错误的,这在美学上让我感到不快。@geowa4-Cython与CPython不同。看:呜呜,对不起。我刚才听到很多人在谈论cython,意思是cpython。他们用它来区分标准impl和jython。该死的命名。
默认选项['emit\u linenums']
就是我想要的,谢谢!