(Python 3.X) Функция Python exec () выдает TypeError без причины - PullRequest
0 голосов
/ 15 сентября 2018

У меня возникла проблема с проектом, над которым я работаю.Я нашел, где в коде происходит эта проблема, и поместил ее в изолированную простую среду, и ошибка не исчезла.

Вот код:

def parse(input_var):
    input_var = input_var.split("[METHOD]")
    if(len(input_var)>1):
        input_var[0] = input_var[0].replace("using ","exec(parse(")
        input_var[0] = input_var[0].replace(";","))")
        input_var = input_var[0]+input_var[1]
    else:
        input_var=input_var[0]
    exec(input_var)


foo="""
using bar;
[METHOD]
print('Passed foo!')
"""

bar = """
print('Passed bar!')
"""

parse(foo)

А вот результат выполнения кода:

Passed bar!
Traceback (most recent call last):
  File "python", line 22, in <module>
  File "python", line 9, in parse
  File "<string>", line 2, in <module>
TypeError: exec() arg 1 must be a string, bytes or code object

Часть кода "bar" вызывает проблему,хотя это явно строкаЭта вещь настолько отвратительна в том, что она никогда не запускает вторую половину кода «foo», который в моей другой программе, использующей этот код, является своего рода необходимым.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

вы должны удалить вызов exec из "exec (parse ("), он будет работать нормально, потому что функция exec принимает только строку, байты или объект кода, так как нет необходимости добавлять его в этот код кода

def parse(input_var):
    input_var = input_var.split("[METHOD]")
    if(len(input_var)>1):
        input_var[0] = input_var[0].replace("using ","parse(")
        input_var[0] = input_var[0].replace(";",");")
        input_var = input_var[0]+input_var[1]
    else:
        input_var=input_var[0]
    exec(input_var)


foo="""
using bar;
[METHOD]
print('Passed foo!')
"""

bar = """
print('Passed bar!')
"""

parse(foo)
0 голосов
/ 15 сентября 2018

У вас есть эта ошибка, потому что input_var содержит exec.Таким образом, вы пытаетесь выполнить код, который, в свою очередь, пытается выполнить другой код.А второй раз exec аргумент не строка, а функция parse.Поэтому удалите exec слово из input_var.Тогда вы не получите ошибок и получите вывод:

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