Ну, есть несколько способов сделать это. Самый простой способ - использовать 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, но для инициализации переменных разница там небольшая.