仕事で、ある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)