LoginSignup
12
13

More than 5 years have passed since last update.

Pythonでクラスやモジュールのメソッド引数情報をリストアップする

Last updated at Posted at 2016-04-13

仕事で、あるPythonモジュールに属するすべてのメソッド引数をリストアップする必要があったので調べてみました。
すごくニッチな作業だとは思いますが、メモ代わりに(^_^;)

方針

inspectモジュールでトップレベルのクラスやモジュールのメタ情報から探っていく。

inspectモジュールの詳細 -> https://docs.python.org/2/library/inspect.html

inspect.getmembers(object)

引数に与えたオブジェクトに属するすべてのメンバを、tuple('name', 'value')という形式のリストで返却する。

inspect.getargspec(func)

引数に与えたファンクションの引数情報を、tuple(args, varargs, keywords, defaults)という形式で返す。argsに引数のリストが入っている。

以下、例です。

openstackのDBaaSであるTroveのpythonclientが例となっています。
(troveへのAPI発行するI/Fのすべての引数を調べたかった。)

troveclient.v1.client.Client
のクラスのインスタンス変数に、様々なクラスのインスタンスを持っているという構造
それぞれのインスタンスが持っているメソッドの引数を調べるコードが以下

import inspect
import troveclient.v1.client as dbcli


cli = dbcli.Client('', '', '')
cli_info = inspect.getmembers(cli)
for rds_info in cli_info:
    if rds_info[0][0] != "_":
        # Above if statement is for removing private class
        for info in inspect.getmembers(rds_info[1]):
            if inspect.ismethod(info[1]):
                if info[0][0] != "_":
                    # Above "if" statement is for removing private method
                    for arg in inspect.getargspec(info[1]).args:
                        print rds_info[0], info[0], arg

以下はCLIのI/Fを調査するコード
getmembersは本当にすべての属性をとってきてくれるので
デコレータで宣言されている属性なんかもとれました。

 import inspect
 import troveclient.v1.shell as rdscli

 for i in inspect.getmembers(rdscli):
     if inspect.isfunction(i[1]):
         for j in inspect.getmembers(i[1]):
             if j[0] == 'arguments':
                 # Above if statement is for retrieving decorators attribute. 
                 for k in j[1]:
                     required = 'y'
                     default = 'None'
                     helpstr = k[1].get('help')
                     if 'default' in k[1].keys():
                         required = 'n'
                         default = k[1].get('default')
                     if default is None:
                         default = 'None'
                     if helpstr is None:
                         helpstr = 'None'
                     if isinstance(default, list):
                         default = "[" + ",".join(default) + "]"
                     print(i[0] + "|" + k[0][0] + "|" + required +
                           "|" + default + "|" + helpstr)
12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13