Currectly、私は以下しようとしている:一部のmutator
機能がlocals()
別のスコープの変数を変更するには?
def mutator(locals):
locals['n'] = 10
locals['l'].append(10)
def f():
n = 1
l = [1]
mutator(locals())
print(n,l) # >>> 1, [1,10]
f(None)
を使用して他の関数のローカルスコープを受け入れ、それが期待どおりに動作:私は変更可能なリストの内容を変更することができましたが、別の不変「を再バインド」することができませんでしたint
を同じ名前にします。
現在、私はいくつかのオプションを参照してください。
eval()
を、exec()
&共同- スタックフレームとプレイ
mutator()
- で&ローカル変数は
dict
で、このような変数を保持:非常に便利ではないが、おそらく、最良のもの
制限は:target fu f()
には引数付きの関数呼び出しを1つだけ含めることができ、その関数はf()
の現在のスコープ内の値を変更できる必要があります。
だから、実行時に変数の値(別のオブジェクトをバインドする)を再導入する方法はありますか?私はこれを達成する良いトリックがないとは思わない!ここで
は私が達成しようとしているものの例です:
def view(request): # Yes, that's Django!
q = MyModel.objects.all()
data = { 'some_action': True, 'items_per_page': 50 } # defaults. Mutators can change this
mutators.launch(locals(), data) # Launch mutators that may want to narrow the QuerySet
if data['some_action']: # do something useful if no mutator has disabled it
...
# paginate using data['items_per_page']
私はここにdata
辞書を使用したくない:ローカル変数としてそれらを修正する機能が&ずっと良いだろうかなり。 q
QuerySetオブジェクトは変更可能です&ミューテータはその内容を変更できます。
は、より多くの書式設定が必要です。メソッド本体をインデントします。 – Robert
あなたは正確に何を達成しようとしていますか? – Falmarri
これは、関数の内部ロジックの実行時の外部チューニングの方法になるでしょう:)特定のブール値をオン/オフに切り替えて機能を有効/無効にしたり、一部のリストをサブセットに絞り込んだりするなど、高度にカスタマイズ可能なシステムのための良いチューニングと拡張フレームワークを実装する最良の方法です。 – kolypto