0

「ローカル」が返すものと非常によく似た辞書を使用したいというこの状況に陥り続けていますが、それには関数の限られた範囲内の変数しか含まれていません。Pythonでこれを行う方法はありますか?

これを行う理由についてもう少し: 私は Django で遊んでいて、テンプレートのコンテキストを提供するときに、手動で辞書を作成する (DRY 原則に違反している) か、locals() を渡す必要があります。これには、必要以上に多くのエントリが含まれています (無駄です)。Pythonレベルのソリューションの必要性を軽減するdjangoに欠けているものはありますか?

明確にするために:

だから、私が繰り返しヒットしたケースは、私が持っている場所です:

@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() 

これはよりクリーンだと思いますが、実際に必要なエントリが locals() に約 30 個あるため、そのようなずさんなものを知っています。

4

4 に答える 4

5

辞書を作成することが DRY の違反であることに同意するかどうかはわかりませんが、本当に何も繰り返したくない場合は、ビューの上部に「コンテキスト」辞書を定義し、辞書キーを使用できます。ビュー全体の変数の代わりに。

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)
于 2009-05-12T22:57:12.763 に答える
4

辞書を渡すことはどのように DRY に違反しますか? Django はすべて DRY に関するものなので、その標準的な動作が DRY に直接違反するとは思えません。ただし、どちらの場合でも、すべてを簡単にするために、変更されたバージョンの django-annoying を使用します

@render_to('my_template.html')
def myview(request):
    # figure stuff out...
    return {'var1':'val1','var2','val2'}

render_toデコレータは、リクエスト コンテキストとそのすべてを処理します。うまくいきます。

これで解決しない場合は、質問を言い換えることをお勧めします。locals()特に Django のこの種の状況では、いじり回したいことはほとんど必要ありません。

于 2009-05-12T22:54:22.063 に答える
2

私は他の多くの回答者に同意しますが、どちらかlocals()または完全に指定された辞書を渡すこと{'var1':var1, 'var2': var2}はおそらく問題ありませんlocals()

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
于 2009-05-13T09:02:09.997 に答える
2

locals() は「無駄」なので使いたくないと言います。何の無駄?それが返す辞書はすでに存在していると思います。それはあなたにそれへの参照を与えているだけです。ディクショナリを作成する必要がある場合でも、これは Python で最も高度に最適化された操作の 1 つなので、心配する必要はありません。

エラーの可能性が最も少なく、意図を最もよく表すコード構造に注目する必要があります。あなたが気になるムダは、気にする必要はありません。

于 2009-05-12T23:14:39.100 に答える