Как инициализировать класс с данными из файла Python - PullRequest
4 голосов
/ 04 мая 2011

Я хотел бы инициировать класс из данных, хранящихся в простом файле Python, указанном при вызове скрипта. Файл конфигурации с именем myconfig.py :

str='home'
val=2
flt=7.0

Я бы хотел назвать это во время инициализации класса следующим образом. Одной из задач является определение типов переменных в файле. Я знаю о configparser, но этот метод менее многословен, если его можно заставить работать.

class ClassInit(object):
    def __init__(self, configFile):
        fp, path, des = imp.find_module('',configFile)
        imp.load_module(configFile, fp, path, des)
        self.__dict__ = configFile.__dict__
        fp.close()

    def printVal(self):
        print '%s %0.2f'%(self.str, self.val)

if __name__ == '__main__':
    srcDir = 'src/'
    config = osp.join(srcDir, argv[0]) # config for current run 
    ci = ClassInit(config)
    ci.printVal()

Возможно ли что-нибудь подобное?

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Ну, есть несколько способов сделать это. Самый простой способ - использовать eval() или exec для оценки этого кода в области видимости класса. Но это также самый опасный способ, особенно если эти файлы могут быть созданы кем-то, кроме вас. В этом случае создатель может написать вредоносный код, который может делать практически все. Вы можете переопределить ключ __builtins__ в глобальном словаре, но я не уверен, что это делает eval / exec полностью безопасным. Например:

class ClassInit(object):
    def __init__(self, configFile):
        f = open(configFile)
        config = f.read()
        f.close()
        config_dic = { '__builtins__': None}
        exec 'a = 4' in config_dic
        for key, value in config_dic.iteritems():
            if key != '__builtins__':
                setattr(self, key, value)

Этот метод убивает небезопасный объект ' builtins ', но он все еще не совсем безопасен. Например, файл может быть в состоянии определить функцию, которая переопределит одну из функций вашего класса вредоносным кодом. Поэтому я действительно не рекомендую этого, если вы не контролируете эти файлы .py.

Более безопасный, но более сложный способ - создать собственный интерпретатор, который интерпретирует этот файл, но не позволяет запускать какой-либо специальный код.

Вы можете прочитать следующую ветку, чтобы увидеть некоторые предложения по разбору библиотек или другие более безопасные альтернативы eval(): Python: сделать eval безопасным

Кроме того, если все, что вам когда-либо понадобится для вашего файла config.py, - это хорошая инициализация некоторых переменных, и вам не нужно иметь возможность вызывать из него причудливые функции python, вам следует рассмотреть вместо этого использование JSON , Python 2.6 и выше включает simplejson, который вы можете использовать для инициализации объекта из файла. Синтаксис - Javascript, а не Python, но для инициализации переменных разница там небольшая.

0 голосов
/ 04 мая 2011

Можете ли вы попробовать self.__dict__.update(configFile.__dict__)?Я не понимаю, почему это не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...