15

Cython では、通常のraiseキーワードは、Cython ソース ファイルの行と名前への参照を含む C コードを発行し、有用なエラー メッセージを生成できるようにします。

ただし、警告については何も見ていません。呼び出すだけでwarnings.warnは、インタープリターは警告がどこから来たのか混乱したままになります。pyxファイルPyErr_WarnExplicitのマクロに似たものがあれば使えます。__LINE__

警告を発行する標準的な方法、または Cython で pyx の行番号を参照する標準的な方法はありますか?

アップデート

この質問は何ヶ月も開かれているので、Cython には現在警告を発する良い方法がないとしか思えません。誰かがこれを正しく機能させる方法を見つけたり、パッチを提出したりした場合に備えて、ここで開いたままにします。

4

1 に答える 1

4

ここに問題なく動作するものがあります

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
)

#line秘訣は、C コードを生成するときにcython にディレクティブを発行させ、それをだまして__FILE____LINE__が使用できる実際の変数であると認識させることです。次に、警告の warn_explicit 関数を使用して、ソース ファイルと行番号を決定するデフォルトの方法をオーバーライドできます。

于 2010-06-25T15:20:11.507 に答える