唯一Pythonで関数のスコープのローカル辞書を取得
-
21-08-2019 - |
質問
私は1「地元」のように非常に多くの辞書を使用したい、このような状況で終わる続けるバックできますが、それは唯一の機能の限られた範囲内の変数が含まれています。 pythonでこれを行う方法はありますか?
私はこれをしたい理由についてもう少し:私はジャンゴで遊んでいると私は私のテンプレートのコンテキストを与えるために行くとき、私は(DRY原則に違反して)辞書を作るかで渡すのいずれかに手動のどちらかに強制しています地元の人々()はるかに多くのエントリが含まれ、その後(無駄な)必要とされています。おそらく、Pythonのレベルのソリューションの必要性を軽減するだろう、私はジャンゴに欠けている何かありますか?
明確にします:
私はここで、だから、私は繰り返し襲ってきた場合は、次のとおりです。
@render_to('my_template.html')
def myview(request):
var1 = #blahblah
var2 = #...
# do stuff with vars
return {'var1': val1,'var2':val2}
だからではなく、これらの変数と命名規則を繰り返すことで、私がやるます:
@render_to('my_template.html')
def myview(request):
var1 = #blahblah
var2 = #...
# do stuff with vars
return locals()
どの私はクリーナーを見つけるが、私は約30以上のエントリが()、私は実際に必要とする地元の人々であるため、ずさんな、そのようなものを知っています。
解決
私は辞書を作ることはDRYの違反があることを同意するが、あなたが本当にすべてで何かを繰り返したくない場合は、あなただけのビューの上部にある[コンテキスト "辞書を定義することができますかわからないし、ビュー全体の辞書のキーの代わりに変数を使用します。
def my_view(request):
context = {}
context['items'] = Item.objects.all()
context['anothervalue'] = context['items'][2].name
return render_to_response('template.html', context)
他のヒント
どのように辞書DRYに違反通過していますか? DjangoはDRY すべてについてですA>ので、私はそれの標準的な動作は、直接それに違反することはないだろう。しかしながら、いずれの場合も、私はにジャンゴ、迷惑するの修正版を使用し
:全体のことをより簡単に@render_to('my_template.html')
def myview(request):
# figure stuff out...
return {'var1':'val1','var2','val2'}
render_to
デコレータは、要求コンテキストとすべてが良いものの世話をします。うまく動作します。
、私はあなたの質問を言い換え提案します。あなたはlocals()
いじりやりたいと、このような特にジャンゴとこのような状況ではほとんど必要ありませんどのような。
あなたはそれが「無駄」であるため)(地元の人々を使用して好きではないと言います。何の無駄?私はそれだけであなたにそれへの参照を与えて、それが既に返し辞書が存在すると信じています。それは辞書を作成するために持っている場合でもそして、これはPythonで最も高度に最適化された業務の一つであるので、それについては心配しないでください。
あなたは最高のエラーのために最少の可能性を、あなたの意図を表現するコード構造に焦点を当てるべきです。あなたが心配している廃棄物は何も心配することはありません。
私は、あなたが特に「サブセット」のいずれか遠く難しいからだなlocals()
などのdict、例えばしたい場合は{'var1':var1, 'var2': var2}
または完全に指定された辞書のlocals()
のいずれかを渡すと、最も可能性が高いOKであることを他の多くの回答者に同意しながら:ます。
loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())