2016-06-25 2 views
0

Python 3.5.1実行ファイルと可変スコープ

コードと画像をご覧ください。

これはいくつかのDjangoコードですが、質問はPythonに関するものです。

さて、私はエラーを取得:

Exception Value:  
name 'objects' is not defined 
Exception Location: 
/home/michael/workspace/pharchive/pharchive/general/templatetags/md_aux.py in get_aux_info, line 17 

ライン17は、コンテキスト=コンテキスト({:オブジェクトの "オブジェクト"})です。写真ではそれが見えます。

少し上にオブジェクトを追加しようとしました。しかし、それは役に立たなかった。この場合、オブジェクトは本当に空でした。だから、私はそれをコメントアウトした。

さて、スクリーンショットでは、ブレークポイントで停止してもらえます。オブジェクトvarは実際にこのコンテキストでアクセス可能であることがわかります。それには何かが含まれています。

とにかく、私は可変スコープで立ち往生しています。

私は分かりません: 1.なぜオブジェクト= []は私を助けませんでした。 2.オブジェクトにアクセスできるのに対して、なぜこのエラーが発生するのですか。

ここに私にキックを与えてもらえますか?文字列としてコードを構築し、exec utingより

@register.simple_tag 
def get_aux_info(master_document, aux_type):  
    md = MasterDocument.objects.get(pk=master_document) 
    template = get_template("general/md_tags.html") 

    #objects = [] 
    code = "objects = md." + aux_type +"s.all()" 
    exec(code) 
    context = Context({"objects": objects}) 
    return template.render(context) 

http://s019.radikal.ru/i636/1606/d5/a646b7fe8941.png

+0

なぜあなたは 'exec'を使用していますか? 'objects = getattr(md、aux_type + 's')。all()'はその仕事をしますか? – jonrsharpe

+0

私は自分自身でexecに対処することができました。まあ、私は私の武器に入っていない。今はそうです。ありがとうございました 。あなたが答えとしてそれを形作るならば、私はそれをうれしく受け入れます。 – Michael

答えて

0

Aはるかに簡単なアプローチは、内蔵getattr機能を使用して属性にアクセスすることです。これは、何が起こっているのか、それが明確になり、完全にあなたの現在のスコープの問題をサイドステップ:

objects = getattr(md, aux_type + 's').all() 

Pythonはイントロスペクションのこの種のための広範なサポートしています。 exec(およびeval)を使用すると、間違った方法で何かに近づいているという警告が表示されます。

関連する問題