2012-02-25 48 views
1

事前にオブジェクトの名前がわからない場合は、モジュールの先頭で関数を使用する最も良い方法は何か:ユーザの入力であり、したがってその名前は変数に格納されます。名前が変数に格納されている場合、Pythonのモジュールレベルの関数にアクセスする

一つの解決策は、eval()を使用たとえば、ScipyCookbook/SignalSmooth: smooth()に(またStackOverflow: Python Smooth Time Series Dataに対する回答で参照)

import numpy 
window = 'hanning' 
w = eval('numpy.'+window+'(11)') 

w = numpy.hanning(11) 

に相当するであろうが、より優れ方法があります壊れやすい/潜在的に危険なeval?例えば

、好ましいことvars()

w = vars(numpy)[window](11) 

を使用していないでしょうか?任意のより良い/もっとpythonicアイデア?

答えて

4

あなたは、実際の関数に有効なウィンドウ関数名をマッピングする辞書を使用する必要があります:あなたはeval()を使用している場合

windows = {"bartlett": numpy.bartlett, 
      "blackman": numpy.blackman, 
      "hamming": numpy.hamming, 
      "hanning": numpy.hanning, 
      "kaiser": numpy.kaiser} 

、ユーザーは基本的に任意のコードを実行することが許可されています。

バリアント

w = vars(numpy)[window](11) 

は間違いeval()を使用するよりも優れているが、それはまだ、ユーザが選択した機能は、指定されたコンテキストで理にかなっていることを確認していません。 (通常は、あなたの代わりに、このためgetattr()を使用すると思います。)

+1

私はevalやgetattrのような他のアプローチよりもずっと優れています。これも私の個人的な方法です。 +1。私が本当に好きなのは、ハンドラをいつでも交換できることです。 – jdi

+0

私はここでgetattrがより良い選択肢だと主張します - 繰り返しは必要ありません。ハンドラを変更する必要がある場合は、罰金ですが、それ以外は不要です。 –

+0

@Lattyware: 'numpy'モジュールには、約500の呼び出し可能オブジェクトが含まれています。それらのうちの5つだけが窓関数として有用である。 'getattr()'を使うと、500個の関数をすべて使えるようになり、そのほとんどはあなたのプログラムで少なくとも奇妙な動作につながります。さらに、私はこれを「自分自身を繰り返す」とは考えていません。私はNumPyのAPIから私たちのプログラムのユーザーインターフェイスを切り離すことを検討したいと思います。プログラム内にあるこれらのウィンドウ関数がNumPyの*関数オブジェクト*にある*名前*をマップします。繰り返しはありません。 –

4

モジュールの機能は、モジュールの属性である、あなたが行うことができますので:

window = "hanning" 
getattr(numpy, window)(11) 

vars()も結構です。

+2

また、getattrの第3パラメータを使用して、フォールバック関数を渡すこともできます。 –

関連する問題