Каков наилучший способ создания объекта Python, когда у вас есть реализация класса, хранящаяся в строке? - PullRequest
2 голосов
/ 21 августа 2009

Каков наилучший способ динамического создания экземпляра объекта Python, когда у вас есть только класс Python, сохраненный в виде строки?

В качестве фона я работаю в среде Google Application Engine и хочу, чтобы можно было динамически загружать классы из строковой версии класса.

problem = “1,2,3,4,5”

solvertext1 = “””class solver:
  def solve(self, problemstring):
   return len(problemstring) “””

solvertext2 = “””class solver:
  def solve(self, problemstring):
   return problemstring[0] “””

solver = #The solution code here (solvertext1)
answer = solver.solve(problem) #answer should equal 9

solver = #The solution code here (solvertext2) 
answer = solver.solve(problem) # answer should equal 1

Ответы [ 3 ]

9 голосов
/ 21 августа 2009

Увы, exec - ваш единственный выбор, но, по крайней мере, сделайте это правильно, чтобы предотвратить катастрофу: передайте явный словарь (с предложением in, конечно)! E.g.:

>>> class X(object): pass
... 
>>> x=X()
>>> exec 'a=23' in vars(x)
>>> x.a
23

таким образом, вы ЗНАЕТЕ, что exec не будет загрязнять общие пространства имен, и любые определяемые классы будут доступны как атрибуты x. Почти делает exec терпимым ...! -)

0 голосов
/ 21 августа 2009

Простой пример:

>>> solvertext1 = "def  f(problem):\n\treturn len(problem)\n"

>>> ex_string = solvertext1 + "\nanswer = f(%s)"%('\"Hello World\"')

>>> exec ex_string

>>> answer
11
0 голосов
/ 21 августа 2009

Используйте оператор exec , чтобы определить свой класс, а затем создать его экземпляр:

exec solvertext1
s = solver()
answer = s.solve(problem)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...