pythonic
オブジェクト指向に完全に移行せずに (最適化などの目的で) 状態を維持する方法はありますか?
私の質問をよりよく説明するために、JavaScript で頻繁に使用するパターンの例を次に示します。
var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
外部的には、これは他の関数と同じで、オブジェクトなどを初期化する必要はありませんが、クロージャにより値を 1 回計算することができ、それを基本的に定数として使用できます。
Python でのこの例は、正規表現を最適化する場合です。re.compile
コンパイルされたバージョンをmatch
およびsearch
操作に使用して保存すると便利です。
Python でこれを行う唯一の方法は、モジュール スコープで変数を設定することです。
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
または、クラスを作成して:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
前者のアプローチはアドホックであり、関数とその上で宣言された変数が互いに関連付けられているかどうかはあまり明確ではありません。また、モジュールの名前空間を少し汚すことにもなりますが、これにはあまり満足していません。
後者のアプローチは冗長に見え、ボイラープレートには少し重いようです。
これに対処するために私が考えることができる唯一の他の方法は、このような関数を別のファイル (モジュール) に分解し、関数をインポートするだけで、すべてがクリーンになります。
これに対処する方法について、より経験豊富なPythonersからのアドバイスはありますか? それとも、気にせずに問題を解決することに専念しますか?