Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

メモ その4 関数のパラメータ名

こじんメモ
いろんな言語でも関数のパラメータ名を取得するのって大変
rubyperlとかは知らないけど)
限られたパターンでしかないが・・・。
もっと簡単な方法があると思うが

  1. vars(locals)でスコープ内で宣言されている変数名を取得
  2. 宣言されている引き数の数を取得してその数だけ取り出す

これで関数のパラメータ名を取得。
default値はfunc_defaultsより取得する事も可能。
sample.py

def test(a, b):
    c = a + c
    d = c + e
    return str(d)
print test.func_code.co_varnames[:test.func_code.co_argcount]

指定した文字列のモジュールの関数のパラメータ名を調べるには

def _get_mod_func(callback):
    try:
        index = callback.rindex('.')
    except ValueError:
        return callback, ''
    return callback[:index], callback[index+1:]

def get_callback(callable):
    module_name, function_name = _get_mod_func(callable)
    try:
        return getattr(__import__(module_name, {}, {}, ['']), function_name)
    except ImportError, e:
        raise ViewDoesNotExist, "Could not import %s. Error was :%s" % (module_name, str(e))
    except AttributeError, e:
        raise ViewDoesNotExist, "Tried %s in module %s. Error was :%s" %(callable, module_name, str(e))

def get_parameter(call)
    func = get_callback(call)
    argcnt = func.func_code.co_argcount
    arg_list = func.func_code.co_varnames
    return arg_list[:argcnt]

これで大分使いまわせるように。
何に使うか不明ですよ。
うくく。