2012-01-24 4 views
1

globals関数は、モジュール内の関数を含む辞書を返します。dir関数は、モジュール内の関数名を含むリストを返しますが、アルファベット順または辞書内にあります。Pythonモジュール内のすべての関数の名前の一覧をファイルの中に表示します。

モジュール内のすべての関数の名前をファイルに表示される順序で取得する方法はありますか?

+0

オクラホマので、あなたは彼らがファイルに表示されるようにそれらを注文したと言います。あなたが順序付けられていない場合、あなたができないこの情報を使って、まさにあなたは何を望んでいますか? –

+0

私は、順番に関数を実行する特殊なテストシステムを作成しています。各関数によって変更されたグローバルな状態が存在するため、それらを順番に実行する必要があります。 – davidscolgan

+7

... ...オハイオ州の私の神。 –

答えて

2

私の解決策です。ソースファイルを文字列として読み込み、defで始まる行をフィルタリングし、先頭の空白を取り除き、最初のスペースと最初の左の括弧の間の部分文字列を抽出します。

def extract_fns(filename): 
    with open(filename) as f: 
     lines = f.readlines() 
     return [line.split(' ', 1)[1].split('(')[0] for line in lines 
      if line.strip().startswith('def')] 
0

私はこのような必要があったとき、私はデコレータを使用しました。

def remember_order(func, counter=[0]): 
    func._order = counter[0] 
    counter[0] += 1 
    return func 

@remember_order 
def foo(): 
    print "foo" 

@remember_order 
def bar(): 
    print "bar" 

@remember_order 
def baz(): 
    print "baz" 

はい、各機能を個別に飾る必要があります。彼らが言うように、明示的なものは暗黙的なものよりも優れています。あなたが不自然なことをしているので、できるだけ明示的に呼び出すことは良いことです。

ここで、装飾されたすべての機能を、定義された順序で取得したいですか?

import sys 
module = sys.modules[__name__] # get reference to current module 
# you could also use a reference to some other module where the functions are 

# get the functions in the order defined 
funcs = sorted((func for func in 
       (getattr(module, name) for name in dir(module)) 
       if callable(func) and hasattr(func, "_order")), 
       key = lambda func: func._order) 

# call them in that order 
for func in funcs: 
    func() 

しかし、それだけで、アルファベット順にそれらに名前を与えることが容易になるだろう...

関連する問題