0

モジュールをインポートし、モジュールの名前空間を調べて関数を見つけ ( call () メソッドを持つオブジェクトは関数であると想定できます)、関数の名前とその引数を、 def ステートメント。

私の問題は、モジュールをループしてすべての関数を取得した後、文字列であるため関数名を inspect.getfullargspec() に渡すことができないことです。文字列を呼び出し可能にするにはどうすればよいですか?

import inspect
from smtplib import SMTP
from pprint import pprint
def func(x):     
    for item in inspect.getmembers(x):
         lst = inspect.getmembers(x, inspect.isfunction)
         for items in lst:
              func_names = items[0] #names of functions               
              f = r"%s.%s" % (x.__name__, func_names)
              arg = inspect.getargspec(f)
              print(f)



if __name__ == '__main__':
     func(SMTP)
4

2 に答える 2

2

これにはいくつかの間違いがあります。ただし、簡単な答えは、文字列を呼び出し可能にしたくないということです。ペアinspect.getmembersのリストを返し、関数オブジェクトを期待していることを知る必要があるだけです。('func_name', <function object>)inspect.getargspec

したがって、for ループを次のようにすることができます。

for name, fun in lst:
    long_name = r"%s.%s" % (x.__name__, name)
    argspec = inspect.getargspec(fun)
    print(long_name)

別の問題として、r 変数の名前はほとんど説明的ではなく、場合によっては正しくありません。たとえば、呼び出すものfunc_namesは常に正確に1つの名前であり、変数lstはより便利な名前でmembersあり、. 関数に名前を付けることは、通常は良い習慣ではありません。特に、その関数がその内部に複数の変数を必要とする場合は、より適切に名前を付けるべきです。itemmemberfuncfunc

于 2012-05-20T21:58:24.130 に答える