2009-03-11 11 views
4

私は以下のようなことをしたいと思います:特に、変数の値をフィールド名として評価するような 'f.eval(field)'部分。 Pythonでこれをどのように達成しますか?Python、変数として変数の値を評価

def punctuated_object_list(objects, field): 
    field_list = [f.eval(field) for f in objects] 
    if len(field_list) > 0: 
     if len(field_list) == 1: 
      return field_list[0] 
     else: 
      return ', '.join(field_list[:-1]) + ' & ' + field_list[-1] 
    else: 
     return u'' 
+0

+1私が必要とする前にこの質問をしてくれてありがとう。 – Alterlife

答えて

12

getattr(f, field)私が正しくあなたを理解していれば、(あなたはfield = "foo"を持っている、とf.fooを望む可能性がある場合、それは、あります)。もしそうでなければ、明確にしたいかもしれません。 Pythonにはeval()があります。私は他の言語が何であるかはわかりません。 'eval()

+0

+1は私を秒で打ちます:-)ボーナスdoc:http://docs.python.org/library/functions.html#getattr – bobince

+0

愚かな私... pythonのeval(eval())...あなたのためにありがとう回答! –

+0

申し訳ありませんが、あなたはより正しいです! –

0

eval()のPythonの同等はeval()

x = 9 
eval("x*2") 

は18

v = "x" 
eval(v+"*2") 

があまりにも働くあなたを与えるだろうです。

+0

あなたは両方とも正しい...私は両方に目を通すことができない;-( –

+0

evalは悪である!全くそれを使用しない方が良い方法は常にある – hasen

0

Pythonオブジェクトのすべてのフィールドのリストを取得するには、__dict__プロパティにアクセスします。

class Testing(): 
    def __init__(self): 
     self.name = "Joe" 
     self.age = 30 

test = Testing() 
print test.__dict__ 

結果:詳細については

{'age': 30, 'name': 'Joe'} 
+0

同じではない。 –

4
getattr(object, 'field') #note that field is a string 

f = 'field_name' 
#... 
getattr(object, f) 


#to get a list of fields in an object, you can use dir() 
dir(object) 

、以下を参照してください。http://www.diveintopython.org/power_of_introspection/index.html

は、文字列は、この特定の場合には安全である場合でも、evalをを使用しないでください!ちょうどそれに慣れないでください。ユーザーからの文字列を取得している場合は、悪意のあるコードになる可能性があります。

マーフィーの法則:物事がうまくいかない場合、それはなります。

+0

"悪意のある"コードを挿入するのは誰ですか?Pythonはソースとして配布されていますか?Pythonはソースとして配布されていますか?コードが変更可能になったときにevalを破棄しようとするのはなぜでしょうか?evalは他のすべてのPythonより安全です。 –

+1

コードがサーバ上で実行されている場合を考えてみましょう。 – hasen

関連する問題