Python C 拡張機能にブール値を渡す「正しい」方法は何ですか? 質問する

Python C 拡張機能にブール値を渡す「正しい」方法は何ですか? 質問する

これは、Python ドキュメント (http://docs.python.org/extending/extending.html) からの簡単な例です。

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return Py_BuildValue("i", sts);
}

関数に追加のブールパラメータを渡したい場合、それを実行する「正しい」方法は何ですか?

PyArg_ParseTuple() に渡す bool オプションはないようです。そこで、次のことを考えました。

  1. 整数を読み取り、その値を使用するだけです(bool は int のサブクラスであるため)
  2. 整数に対してPyBool_FromLong()を呼び出す
  3. オブジェクトを読み取り、PyBool_Check() を呼び出してそれが bool であることを確認します。
  4. おそらく、任意のタイプの変数を取得してその真理値 (つまり、空の配列は false になるなど) を取得する方法があり、これは Python 関数が通常行うことです。

これらのうちどれが好ましいですか? 他のオプションはありますか?

ベストアンサー1

4 おそらく、任意のタイプの変数を取得してその真理値を取得する方法があります (つまり、空の配列は false になりますなど)。これは、Python 関数が通常行うことです。

はい: (からPython/C API リファレンス

int PyObject_IsTrue(PyObject *o)

オブジェクト o が真であると判断された場合は 1 を返し、そうでない場合は 0 を返します。これは、Python 式 not not o と同等です。失敗した場合は -1 を返します。

編集。実際の質問に答えると、アプローチ 1 が正しいと思います。なぜなら、int は C の対応する型だからです。アプローチ 4 は良いですが、関数が bool を取るようにドキュメント化されている場合は、任意のオブジェクトを受け入れる必要はありません。3 のような理由のない明示的な型チェックは、Python では好ましくありません。2 のような別の Python オブジェクトへの変換は、C コードの役に立ちません。

おすすめ記事