2011-02-07 18 views
4

私は有用と思われるPyEval_CallFunctionというPython C APIの関数を発見しました。Python C API:PyEval_CallFunction?

PyEval_CallFunction(obj, "OOO", a, b, c); 

しかし、私はこの機能上の任意の公式ドキュメントを見つけることができません:それはあなたのような何かを言って呼び出し可能なPythonのを呼び出すことができます。 Google検索では、この機能を議論し、様々なunofficial tutorialsが表示されます、しかし:公式 のPythonドキュメントで

  1. 機能isn't documented、それはの一部でさえ になっている何か だ場合、私は知りませんパブリックAPI

  2. ウェブを検索すると、一致しない使用ポリシーである が表示されます。一部の チュートリアルでは、 "(OiiO)"のように、 フォーマット文字列には括弧 が必要ですが、それ以外の時間は括弧なしで使用されます。 実際に実際のプログラムを で試してみると、 のかっこが必要です。それ以外の場合は segfaultsです。

私はこの機能を使いたいと思っています。誰でもこれについて何か知っているのですか、それともなぜそれを知っていますかisn't documented?公開APIの一部ですか?

答えて

5

私はどちらかそれへの多くの参照を見つけることができませんでしたが、あなたはにリンクチュートリアルでは、この言及:

文字列の形式で、次の 引数はPy_BuildValue (XXXと同じですので、私は本当に持っている必要があります記載されている これまでに!)。コールは、このような

PyEval_CallFunction(obj, "iii", a, b, c); 

としての価値がかなり限定されたようだと私は、PyEval_CallFunctionがパブリックAPIではないと仮定し

PyEval_CallObject(obj, Py_BuildValue("iii", a, b, c)); 

に相当します。これらの2つの違いはあまりありません。しかし、もう一度、私は実際にPythonの拡張に関与していないので、これは私の見解です。

PyEval_CallObjectそのものはPyEval_CallObjectWithKeywordsのマクロです。

#define PyEval_CallObject(func,arg) \ 
     PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) 

"パブリックAPIとは何ですか?" の問題についてただ、ストレスに

とGeorgの 説明をサポートしています:。ここマーティンvから最近のメッセージはLOWISあるAPIはないドキュメントを通じて を定義しているが、代わりに 主にヘッダファイルによる。 PyAPI_FUNC として宣言され、_Pyで始まらない関数はすべてpublic APIです。以前は、文書化されていないAPIがたくさんありました(1.4まで、APIのマニュアルは全くなく、拡張モジュールチュートリアルのみでした)。最近ではますますAPIが文書化されています。

http://mail.python.org/pipermail/python-dev/2011-February/107973.html

+1

Martinのメッセージの文脈では、「公開」とは、最初に廃止予定プロセスを経ることなく変更または削除しないAPIを指します。これは、文書化された代替が利用可能な場合は、文書化されていないAPIを呼び出すことをお勧めします。 'PyEval_CallFunction'の場合、文書化された(そして好ましい)APIは' PyObject_CallFunction'であり、これは 'PyEval_CallFunction'が既に呼び出しコードによって処理されていると仮定する追加のステップを含みます。 – ncoghlan

5

あなたが代わりにPyObject_CallFunctionを使用しなければならないので、それが文書化されていない理由があります。

PyEval_*ファンクションファミリは、インタープリタ評価ループの生の内部コールです。対応する文書化されたPyObject_*呼び出しには、すべての追加のインタプリタ状態の完全性検査、引数の検証、およびスタック保護が含まれています。

+1

また、http://bugs.python.org/issue11165 – ncoghlan