0

この質問は、私の前の質問に続くものです

builtin_print()の実装全体を変更する必要はありません。たとえば、---'python'の特定の引数を探す必要があります。

次のステートメントの場合— </ p>

from __future__ import print_function
print('python')

'python'の出力があるときはいつでも、コードに何か他のことをさせたいです。問題は次のとおりです。

builtin_print(PyObject *self, PyObject *args, PyObject *kwds)

argsはPyObjectタイプです。'Python'でstrcmpまたはmemcmpargs[1]を実行する方法はありません。

何か案は?

4

1 に答える 1

0

Pythonインタープリターが処理するオブジェクトはPythonオブジェクトであり、Cオブジェクトではありません。したがって、次のように、インタプリタ固有の関数を使用してC文字列と比較する必要があります。

PyObject *o = PyTuple_GetItem(args, i);
if (PyUnicode_CheckExact(o) && PyUnicode_CompareWithASCIIString(o, "Python")==0){
    printf("Do something else ..\n");
} else {
    err = PyFile_WriteObject(o, file, Py_PRINT_RAW);
    if (err)
        return NULL;
}

現在のコードの代わりに追加します。古い2.7.3リリースでは、次のようなPyString*関数ファミリーを使用する必要があります。

if (PyUnicode_CheckExact(o)) {
    PyObject* utf8 = PyUnicode_AsUTF16String(o);
    if (strcmp(PyString_AsString(o), "Python")==0) {
        printf("Do something else (unicode)\n");
    }
    Py_DECREF(utf8);
} else if (PyString_CheckExact(o) && strcmp(PyString_AsString(o), "Python")==0){
    printf("Do something else (str) ..\n");
} else {
    err = PyFile_WriteObject(o, file, Py_PRINT_RAW);
    if (err)
        return NULL;
}

これは、ユニコード文字列()を処理しないことに注意しu'Python'てください。また、printステートメントcase PRINT_ITEMを処理するinを変更することもできます。Modules/ceval.c

Pythonプログラムには、呼び出す以外の方法で印刷する方法があることに注意してください。たとえば、navtive(C)関数に書き込んだり、印刷を実行させたりしますprintsys.stdout

于 2012-10-28T20:57:49.107 に答える