2009-05-12 17 views
0

私は、 'locals'が返すものと非常によく似た辞書を使用したいが、関数の限定されたスコープ。これはPythonでこれを行う方法はありますか?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() 

私はクリーナーを見つけましたが、地元の人々()に約30のエントリがあるので、私はそれほど種類がありません。

+1

「手作業で辞書を作成する(DRY原則に違反している」とは何ですか?辞書をDRYに違反させる方法は? –

+0

この特定の状況を意味します。変数(var = blahblah) {'var':var}を実行すると、名前の決定が繰り返されているように見えます。4つまたは5つの変数を使用すると、面倒で面倒なことになります。 – Albinofrenchy

+0

私は気づいていませんでした。まず、私はビュー関数に多くのローカル変数を作成しません。通常はわずかです。処理が複雑な場合、私はそれをビュー機能から引き出します。第二に、私はしばしば、ビュー機能の一部ではなくディクショナリでのみ作成される文脈情報で辞書をロードします。繰り返しは、通常、オブジェクト、オブジェクトリスト、時には要求から引き出されたキーまたは2つのものだけである。 –

答えて

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) 
4

辞書にDRYの違反をどのように渡していますか? Django is all about DRYなので、私はその標準的な動作が直接それに違反するとは思わない。しかしながら、いずれの場合も、私は全部容易にするためにdjango-annoyingの修正版を使用します。

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

render_toデコレータは、要求コンテキストのケアとすべてが良いものになります。うまくいく。

これで解決できない場合は、質問の言い換えをお勧めします。あなたがlocals()でめちゃくちゃにしたいことが何であれ、これは特にDjangoのこのような状況ではほとんど必要ありません。

+0

上記の説明を追加しました(このコードはコメントでうまくいきません)。関係なく、ジャンゴ迷惑はとてもクールに見える、私は今日get_object_or_noneが欲しいと思っていた。 – Albinofrenchy

+0

+1:DRYに違反していないことに同意します。確かに、テンプレートコンテキストに固有の値マッピングを作成することで、既存のもの(つまりマッピング)を作成しているので、何も繰り返されません。多くの場合、テンプレートコンテキスト内の項目はそのテンプレート専用に作成されます。常にビューのロジックを完全に再作成できますが、常に同じコンテキスト辞書を作成して、テンプレートを他のアプリケーション層から分離する必要があります。 locals()をテンプレートに渡すことは、特に複数の開発者やデザイナーがいるプロジェクトでは、かなり危険です。 –

+0

一般的なケースでは、私は同意します:そのマッピングはビューの実装に関係なくテンプレートに準拠する必要があります。実際には、関数のローカルコンテキストとテンプレートのコンテキストが同じである特定の状況が発生しますが、実際にはそうだと思います。私はそれを表現する方法が欲しい。 local()を渡すことは危険であることに同意します。これが私がこの質問を書いた理由の1つです。 – Albinofrenchy

2

あなたは「無駄」であるため、あなたは地方()を使用することを好まないと言います。何が悲しい?私は、それが返す辞書がすでに存在していると信じています。辞書を作成する必要があるとしても、これはPythonで最も高度に最適化された操作の1つなので、心配する必要はありません。

エラーの可能性はほとんどなく、意図を最もよく表すコード構造に焦点を当てる必要があります。あなたが心配している廃棄物は心配するものではありません。

+0

彼の懸念は、使用されていない変数の束でテンプレートの範囲を汚染していると思います – Jiaaro

2

私はどちらかlocals()か、具体的にしたい場合は、完全に指定された辞書{'var1':var1, 'var2': var2}は、最も可能性が高いOKですを渡す他の多くの回答者に同意しながら、「サブセット」のいずれかのハードにはほど遠いですlocals()などのdict、例えばへ:

loc = locals() 
return dict((k,loc[k]) for k in 'var1 var2'.split()) 
関連する問題