関数として呼び出したいユーティリティをいくつか書いています。それらは、変化しない傾向があるコンテキストといくつかのデータで呼び出されます。コンテキストを使ってフッキングを行うには多くの時間がかかりますが、それが完了すると、それを使用してデータをむき出しにすることはかなり軽量です。
これは明らかに次のパターンにうまくマッピングされます
class MyFunc():
def __init__(self, context):
self.foo_d_context=foo(context)
def __call__(self, data):
return bar(self.foo_d_context, data)
if __name__ == '__main__':
my_callable=MyFunc(my_context)
results1=my_callable(my_data1)
results2=my_callable(my_data2)
しかし、私のユーザーは my_callable オブジェクトの最初の作成に反対しています。彼らにとってより受け入れられるのは、次のように使用できる機能です...
results=my_func(my_context, my_data)
...そして関数 my_func に、前の呼び出しからの既存のデータが存在するかどうかを確認させ、最後の呼び出しと同じです。
これに関する問題は、関数が初めて呼び出されたときです。永続データをどこに保存できますか? すでに Python 標準ライブラリに含まれているいくつかのユーティリティは、このように機能すると述べているようで、ドキュメントでは、オブジェクトをセットアップするヘルパー関数について説明しています。しかし、私はそれがどのように機能するかを理解していません。
私はそれを行う方法を考えることができますが、それは間違っていると感じます。オブジェクトを globals() 名前空間に直接配置でき、任意の関数内から実行できるようです。だから私はできる
def my_func(context,data):
glob=globals()
try:
if glob['__my_persistent_reference_context_$$$'] == context:
return bar(glob['__my_foo_d_context_$$$'],data)
except KeyError:
pass
glob['__my_foo_d_context_$$$']=foo(context)
glob['__my_persistent_reference_context_$$$'] = context
return bar(glob['__my_foo_d_context_$$$'],data)
上記を書いた後、この関数は MyFunc クラスのオブジェクトを作成できることに気がつきました。これは、私が探している概念に近いように聞こえますが、それでも何かを呼び出してどこかに配置する必要があるため、そうではありません。 「グローバル名前空間を使用できますか?」という基本的な問題を解決できません。問題。
これでよろしいですか?
それは常に機能しますか?(私は 2.6.6 を使用していますが、最終的には 3 でも動作しますか?)
それを行うより良い方法はありますか?
汚染するより良い名前空間はありますか?
クラスの方法が単に正しい方法であると主張する必要がありますか?