78

この機能について

def eat_dog(name, should_digest=True):
    print "ate dog named %s. Digested, too? %" % (name, str(should_digest))

関数の外部で、その引数と添付されているデフォルト値を読み取りたい。nameしたがって、この特定の例では、 にはデフォルト値がなく (つまり、必須の引数であること)、それTrueが のデフォルト値であることを知りたいですshould_digest

inspect.getargspec()、引数とデフォルト値に関する情報を提供してくれますが、この 2 つの間に関連性は見られません。

ArgSpec(args=['name', 'should_digest'], varargs=None, keywords=None, defaults=(True,))

Trueこの出力から、 (defaultsタプルで) が のデフォルト値であることをどのように判断できますshould_digestか?

さらに、問題にアプローチする「許しを求める」モデルを認識していますが、残念ながら、そのエラーからの出力では、欠落している引数の名前がわかりません。

>>> eat_dog()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: eat_dog() takes at least 1 argument (0 given)

コンテキスト (なぜこれを行う必要があるのか​​) を示すために、JSON API を介してモジュール内の関数を公開しています。呼び出し元が特定の関数引数を省略した場合、省略された特定の関数引数を示す特定のエラーを返す必要があります。クライアントが引数を省略しても、関数シグネチャにデフォルトが提供されている場合は、そのデフォルトを使用したいと考えています。

4

6 に答える 6

127

Python3.x

python3.x の世界では、おそらくSignatureオブジェクトを使用する必要があります。

import inspect

def get_default_args(func):
    signature = inspect.signature(func)
    return {
        k: v.default
        for k, v in signature.parameters.items()
        if v.default is not inspect.Parameter.empty
    }

Python2.x (古い回答)

args/defaults は次のように組み合わせることができます。

import inspect
a = inspect.getargspec(eat_dog)
zip(a.args[-len(a.defaults):],a.defaults)

以下a.args[-len(a.defaults):]はデフォルト値を持つ引数であり、明らかa.defaultsに対応するデフォルト値です。

の出力をコンストラクターに渡して、キーワードのアンパックに適したマッピングを作成することもできzipますdict


ドキュメントを見ると、このソリューションは python2.6 以降でのみ機能します。これは、名前付き tupleinspect.getargspecを返すと想定しているためです。以前のバージョンは通常の tupleを返しましたが、それに応じて変更するのは非常に簡単です。古い(および新しい)バージョンで動作するバージョンは次のとおりです。

import inspect
def get_default_args(func):
    """
    returns a dictionary of arg_name:default_values for the input function
    """
    args, varargs, keywords, defaults = inspect.getargspec(func)
    return dict(zip(args[-len(defaults):], defaults))

良く考えると:

    return dict(zip(reversed(args), reversed(defaults)))

も機能し、一部の人にとってはより直感的かもしれません。


于 2012-09-27T17:46:14.617 に答える
11

inspectモジュールをそのgetargspec機能で使用できます:

inspect.getargspec(func)

Python 関数の引数の名前と既定値を取得します。4 つのうちの Atupleが返されます: (args, varargs, keywords, defaults). args引数名のリストです(ネストされたリストを含む場合があります)。varargsおよびkeywordsは、*および**引数 またはの名前ですNonedefaultsデフォルトの引数値のタプルであるNone、デフォルトの引数がない場合。このタプルにn要素がある場合、それらは にリストされている最後のn要素に対応しargsます。

引数名とそのデフォルト値を取得する方法に関する正確なコードについては、mgilson の回答を参照してください。

于 2012-09-27T17:46:14.380 に答える
1

Python では、デフォルト値を持つすべての引数は、デフォルト値のない引数の後に来ます。したがって、デフォルト値リストを使い果たすまで、マッピングは最後から開始する必要があります。したがって、ロジック:

dict(zip(reversed(args), reversed(defaults)))

正しくマッピングされたデフォルトを提供します。

于 2014-11-22T02:29:06.957 に答える