0

getattrを使用して実行時に関数を呼び出しています。多くの機能があり、それらはいくつかの別々のファイルにあります。私は現在これを次のように行っています:

関数がPACKAGE/features_*。pyにあると言います

実際の呼び出しは、クラスメソッドで行われます。

class SomeClass(object):
    ...

    def call(self, **kwargs):
        function_name = '{}_{}'.format(self.parms['prefix'], self.parms['name'])
        file_name =  self.parms['prefix']
        mod_name = 'PACKAGE.{}'.format(file_name)
        module = __import__(mod_name, globals(), locals(), [file_name,])
        return getattr(module, function_name)(**kwargs)

上記のコードは正常に機能しますが、私には非常に複雑に見えます。また、このメソッドが呼び出されるたびに、PACKAGE / function _ *。pyファイルを開く必要があるように見えます(インポートステートメントがないため)。

このメソッドは何千回も実行されるので、コードが不必要に非効率になることは望ましくありません。

質問:これを行うためのより良い/より効率的な方法はありますか?それとも、ファイルを繰り返し開くことの非効率性についての私の懸念は根拠がありませんか?

注:最初にすべてのPACKAGE.function_x.pyファイル(多くはありません)をインポートする方がわかりやすいように見えましたが、getattr(モジュール)オブジェクトを使用してこれらのインポートを参照する方法を理解できませんでした。

4

1 に答える 1

2

インポートした関数をキャッシュしてみませんか?たとえば、クラスに_cached_func辞書を含めるようにします。

class SomeClass(object):
    def __init__(self):
        self._cached_func = {}

    def call(self, **kwargs):
        function_name = '{}_{}'.format(self.parms['prefix'], self.parms['name'])

        try:
            func = self._cached_func[function_name]
        except KeyError:            
            file_name =  self.parms['prefix']
            mod_name = 'PACKAGE.{}'.format(file_name)
            module = __import__(mod_name, globals(), locals(), [file_name,])
            func = getattr(module, function_name)
            self._cached_func[function_name] = func

        return func(**kwargs)
于 2012-08-08T11:08:06.447 に答える