0

モジュールを動的に読み取り、そのモジュール内のすべての関数のリストを作成するメソッドをPythonで記述したいと思います。次に、このリストをループして、各関数を呼び出します。これまでのところ、次のコードがあります。

import mymodule
from inspect import getmembers, isfunction

def call_the_functions():
    functions_list = [f for f in getmembers(mymodule) if isfunction(f[1])]
    for f in functions_list:
        result = f()

私の問題は、一部の関数が引数を必要とするためにプログラムがクラッシュすることです。次のようなことをしたいのですが、方法がわかりません。

for f in functions_list:
    args = [""] * f.expectedNumberOfArguments()
    result = f(*args)

私はこれを正しい方法で行っていますか?(私は基本的に単体テストを作成しています。最初のチェックは、呼び出される引数に関係なく、関数が正しい型のオブジェクトを返すことです。)

4

3 に答える 3

3

あなたが使用することができますinspect.getargspec()

In [17]: def f(x, z=2, *args, **kwargs): pass

In [18]: inspect.getargspec(f)
Out[18]: ArgSpec(args=['x', 'z'], varargs='args', keywords='kwargs', defaults=(2,))

任意の引数で何も知らない関数を呼び出すことが意味があるかどうかは別の質問です...

于 2012-12-06T19:43:20.520 に答える
3

あなたのアプローチは根本的に欠陥があります。TypeError注意深く記述されている場合、関数は、発生またはアサートすることにより、無効な型の引数を拒否します。これに失敗すると、パラメータの属性またはメソッドにアクセスしようとし、すぐに。を取得しAttributeErrorます。

テストされている関数について何かを知っている単体テストを書かないようにするのは無駄です。

于 2012-12-06T19:48:09.193 に答える
1

inspectモジュールとを使用できますgetargspec。簡単な例を次に示します。

import inspect

def myfunc(x): 
    return x * 2 

print inspect.getargspec(myfunc);

与える:

ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

一部の関数はジェネレーターである可能性があるため、それらを呼び出すテスト戦略では、期待したものが得られない可能性があり、それ inspect.isgeneratorfunction()をテストできます。

于 2012-12-06T19:49:31.320 に答える