2011-12-27 16 views
6

Ben yapılandırma dosyalarını işleme esnek basit ama yönlü olarak Python execfile() fonksiyonunu kullanıyorum - temelde, fikir:Bir python modülünü bir dict içine içe aktarma (execfile() içinde globals olarak kullanmak için)?

# Evaluate the 'filename' file into the dictionary 'foo'. 
foo = {} 
execfile(filename, foo) 

# Process all 'Bar' items in the dictionary. 
for item in foo: 
    if isinstance(item, Bar): 
    # process item 

Bu benim yapılandırma dosyası tanımına erişimi olduğunu gerektirir Bar sınıfı. Bu basit örnekte, bu önemsiz; boş bir demeden ziyade foo = {'Bar' : Bar} tanımlayabiliriz. Ancak, gerçek örnekte, yüklemek istediğim bir modülüm var. Zaten üst düzey dosyasında BarModule ithal ettik Ancak

foo = {} 
eval('from BarModule import *', foo) 
execfile(filename, foo) 

yüzden sadece doğrudan BarModule tarafından tanımlanan şeylerin seti olarak foo tanımlamak mümkün olmalıdır gibi görünüyor: o dair bariz sözdizimi Bu eval ve import zincirinden geçmek zorunda kalmadan.

Bunu yapmak için basit bir deyim var mı?

+1

Değerlendirmeyi dosyalamıyorum; execfile demek istiyorsun? –

+0

Python ifadeler ve ifadeler arasında bir ayrım yaptığı için, eval kullanımı açık fikir IMO değildir. eval bir ifadeyi değerlendirebilir (ör., eval ('2 + 2') '), exec ifadeler içindir (ör. 'exec' a = 2 + 2 '). ithalat bir ifadedir. –

+0

@ ÉricAraujo: execfile demek istedim; düzenlemeler yapıldı. –

cevap

7

Belki de modül tarafından tanımlanan __dict__'u kullanabilirsiniz.

>>> import os 
>>> str = 'getcwd()' 
>>> eval(str,os.__dict__) 
1

kalan solüsyon getattr kullanmaktır:

>>> s = 'getcwd' 
>>> getattr(os, s)() 
6

bir dict (örneğin, bir modül olarak), bir nesnenin özelliklerini elde etmek için yerleşik vars() işlevini kullanın.

İlgili konular