2012-02-11 6 views
3

私は名前の衝突を解決する最善の方法を考え出すのに苦労しています。私の目の前にあるものの要点は次のとおりです。定義された関数と別の関数のパラメータとの間の名前の衝突を解決するにはどうすればよいですか?

def clean(): 
    # do some cleaning stuff 

def build(clean=True): 
    if clean: 
     clean() 

いくつかの理由から、私はここでAPIを変更したくありません。この矛盾を解決する最良の戦略は何ですか?今のところ、私がやっている:リネーム、物事の短い最高/唯一の解決策かもしれません

def clean(): 
    # do some cleaning stuff 
clean_alias = clean 

def build(clean=True): 
    if clean: 
     clean_alias() 

。関数の本体の外側のスコープにあるcleanを参照する別の方法があるかどうかは疑問です。

答えて

2

試してみてください。

globals()['clean']() 

グローバル()現在のグローバルシンボルに テーブルを表す

戻り辞書。これは常に現在のモジュールの辞書です( の関数またはメソッドの内部で、これは呼び出されたモジュール ではなく、定義されているモジュールです)。

+0

偉大な答え。わかりやすくするために関数定義の先頭に 'clean_func = globals()['clean']'を実行しました。私は明日の回答としてこれをマークします、それは私にそれをまだマークさせません。 – jsdalton

1

グローバルclean関数をローカル変数にバインドするデフォルト引数を追加してみてください。

def build(clean=True, cleanFn=clean): 
    if clean: 
     cleanFn() 
+0

良い提案。私は彼の解決策が関数の署名に無関係のノイズを追加しないので、@ Kosが与えた答えに行くことになった。 – jsdalton

関連する問題