【问题标题】:Emitting Cythonic warnings?发出 Cythonic 警告?
【发布时间】:2010-04-15 16:26:37
【问题描述】:

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

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

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

更新

这个问题已经开放了几个月,所以我只能假设 Cython 目前没有发出警告的好方法。我将在此处保持打开状态,以防有人找到方法/提交补丁以使其正常工作。

【问题讨论】:

  • 警告是针对您程序的用户的。为什么他们需要行号?
  • @Tobias - 这样当他们向您发送警告消息的输出时,很容易看到它是从哪里发出的。此外,使用图书馆的人的集合通常包括确实(或愿意)维护所述图书馆的人。无论用户查看行号是否有用,解释器都会在收到警告时将其与来自的模块一起显示。如果你在 Cython 中使用warnings.warn,那么报告的模块和行都是错误的,这在美学上对我来说是不愉快的。
  • @geowa4 - Cython 与 CPython 不同。见:cython.org
  • 哎呀,对不起。我刚刚听到很多人谈论 cython 意思是 cpython。他们使用它来区分标准 impl 和 jython。该死的命名。

标签: python warnings cython


【解决方案1】:

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

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
)

诀窍是让 cython 在生成 C 代码时发出 #line 指令,并诱使它认为 __FILE____LINE__ 是它可以使用的真实变量。那么warnings中的warn_explicit函数就可以用来覆盖判断源文件和行号的默认方法了。

【讨论】:

  • default_options['emit_linenums'] 是我要找的,谢谢!
猜你喜欢
  • 2012-05-03
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 2016-02-25
  • 1970-01-01
相关资源
最近更新 更多