2012-05-11 2 views
3

У меня есть строковая переменная, содержащая функцию. функция выглядит следующим образом:Python exec NameError

def program(): 
    x[0] = y[1] 
    z[0] = x[0] 
    out = z[0] 

Это в методе:

def runExec(self, stringCode): 
    x = [1,2,3,4] 
    y = [5,6,7,8] 
    z = [6,7,8,9] 
    exec stringCode 
    return out 

Я получаю NameError, кажется, х, у и г не доступны из stringCode Exec?

Как я могу сделать эти переменные доступными, мне нужно каким-то образом передать их?

Благодаря

+3

Зачем вам нужно использовать 'exec'? – eumiro

ответ

2

Если у вас есть хороший повод, чтобы использовать exec, который является предположение, Вам необходимо перепроверить.

Для функции exec вам необходимо предоставить глобальную и локальную область. Кроме того, строка «program» должна фактически выполняться вместо простого определения функции. Это будет работать:

prog = """ 
x[0] = y[1] 
z[0] = x[0] 
out = z[0] 
""" 

def runExec(stringCode): 
    x = [1,2,3,4] 
    y = [5,6,7,8] 
    z = [6,7,8,9] 
    exec(stringCode, globals(), locals()) 
    return out 

print runExec(prog) 
2

Почему вы должны использовать exec? Следующий код должен работать точно так же, только без exec:

def program(x, y, z): 
    x[0] = y[1] 
    z[0] = x[0] 
    out = z[0] 
    return out 

def runExec(self, func): 
    x = [1,2,3,4] 
    y = [5,6,7,8] 
    z = [6,7,8,9] 
    out = func(x, y, z) 
    return out 

self.runExec(program) 
+0

Мне нужно использовать exec, это не будет тот же код каждый раз, когда код генерируется «на лету». Вышеприведенное является лишь примером. – Sherlock

1

Вы можете сделать их глобальными.

global x,y,z 
def runExec(self, func): 
    x = [1,2,3,4] 
    y = [5,6,7,8] 
    z = [6,7,8,9] 
    out = func(x, y, z) 
    return out