2012-02-09 8 views
0

私はPythonコードでexecまたはevalを使用しないことに関するいくつかの質問を読んでいました。evalを使用する代わりに参照で辞書を渡す/可変数の引数を渡す方法

私は現在pyramidに基づいたpython Webプログラムを持っており、フォームからいくつかの変数を受け取り、関数を呼び出します。この機能またはオプションのすべての引数、これは多かれ少なかれ、私は何をすべきかは、私は自分のアプリケーションを強化しようとしていますし、私は何か他のものではevalを交換しようとしています

command = 'function_to_be_called (' 

if optional_variable_in_form in request.params : 
    command += 'optional_variable=optional_variable_in_form' 

command += ')' 

i = eval (command) 

です。私はthis answerを見つけました。私の解決策を使用する代わりに、辞書を参照渡しすることを提案しています。

だから私の質問は以下のとおりです。

  1. は、あなたはそれが行くには良い方法だと思いますか?
  2. 私はいつも、著者が提案した辞書をどの関数にも渡すことができますか?
  3. 私はかなり気になります**が、私はそれが何をしているのかよく分かりません。あなたは私にそれについてのヒントを与えたり、私がそれについて学ぶことができる良いページを提案したりすることができますか?

答えて

5

あなただけ行うことができます。これを行うには

function_to_be_called(**option_dict) 

古い方法はapply機能していましたが、それは今*args、および**keywords構文のために廃止されました。それはあなたが機能と引数のタプルを持ち、関数を呼び出すことができることを意味するので

これには、実際には本当にクールです:

def polly(cracker, wants): 
    if wants: 
     print 'polly wants a', cracker 
f = polly 
t = ('cracker', True) 

これらは今、すべて等価です:

polly('cracker', True) 
polly(*('cracker', True)) 
polly(*t) 
f('cracker', True) 
f(*t) 

今度はそれをキーワードの引数として拡張しますが、実際のチュートリアルを参照してください。 @Duncanが指摘するようにしかし、あなたはこれを行うことができます。もっと重要な

polly(**{cracker: 'cracker', wants: True}) 
d = {cracker: 'biscuit', wants: True} 
polly(**d) 
+2

との実際の質問 'D = {「クラッカー」:「ナット」、「望んで」:偽}答えるために' 'ポリーを(** d) 'も同等です。 – Duncan

+0

素晴らしい!ありがとう。私は半分通して入力を断念したと思います! –

関連する問題