2012-07-05 9 views
6

モジュールから取得したメソッドの引数を調べようとしています。 便利な機能を持つinspectモジュール、getargspecが見つかりました。 私は定義した関数に対しては動作しますが、インポートされたモジュールの関数に対しては機能しません。組み込み関数を持つPython inspect.getargspec

import math, inspect 
def foobar(a,b=11): pass 
inspect.getargspec(foobar) # this works 
inspect.getargspec(math.sin) # this doesn't 

私はこのようなエラーが得られます。

File "C:\...\Python 2.5\Lib\inspect.py", line 743, in getargspec 
    raise TypeError('arg is not a Python function') 
TypeError: arg is not a Python function 

ですinspect.getargspecローカルのみの機能のために設計されたのか、私が何か間違ったことをやっていますか?

+1

はい、このように設計されています。http://bugs.python.org/issue1748064 – georg

答えて

11

PythonではなくC言語で実装されている関数について、このような情報を得ることは不可能です。

なぜなら、引数が(やや)getargのようなやり方で渡されるので、(フリーフォーム)docstringを解析する以外は、メソッドが受け入れる引数を見つける方法がないからです。その関数を実際に実行せずにどの引数が受け入れられるかを調べる。

+0

を参照してください。さて、私はこれに戻ります。それで、それを行うための汚い方法さえあります。関数を呼び出す必要がある場合は大丈夫です。 – PeetWc

+0

**いいえ、**実際にはありません。関数を呼び出すことで例外が発生しない場合には、いくつかの引数だけを指定することができます。しかし、それはほとんど役に立ちません。試していないオプションの引数があるかどうか分かりません。 – ThiefMaster

+0

敬意を表します。ありがとう。私は別の方法を見つける必要があります。 – PeetWc

1

ほとんどの場合、getargspecと同じタイプの情報を含む関数/メソッドのドキュメント文字列を取得できます。 (すなわち、パラメータ名、パラメータ数、オプションパラメータ、デフォルト値)。

あなたの例では

import math 
math.sin.__doc__ 

"sin(x) 

Return the sine of x (measured in radians)" 

を与えます残念ながら、運転中に、いくつかの異なる規格があります。 What is the standard Python docstring format?

どの標準規格が使用されているかを検出して、そのように情報を取得できます。上記のリンクから、pymentのように見えるだけで役立つかもしれません。

関連する問題