При попытке использовать инструкцию "exec" Python, я получил следующую ошибку:
TypeError: exec: arg 1 must be a string, file, or code object
Я не хочу передавать строку или файл, но что такое объект кода и как его создать?
При попытке использовать инструкцию "exec" Python, я получил следующую ошибку:
TypeError: exec: arg 1 must be a string, file, or code object
Я не хочу передавать строку или файл, но что такое объект кода и как его создать?
Один из способов создания объекта кода - использовать встроенную функцию compile
:
>>> compile('sum([1, 2, 3])', '', 'single')
<code object <module> at 0x19ad730, file "", line 1>
>>> exec compile('sum([1, 2, 3])', '', 'single')
6
>>> compile('print "Hello world"', '', 'exec')
<code object <module> at 0x19add30, file "", line 1>
>>> exec compile('print "Hello world"', '', 'exec')
Hello world
также функции имеют атрибут функции __code__
(также известный как func_code
в более старых версиях), из которого вы можете получить объект кода функции:
>>> def f(s): print s
...
>>> f.__code__
<code object f at 0x19aa1b0, file "<stdin>", line 1>
Существует замечательная запись в блоге Дэн Кроста, объясняющая эту тему, в том числе о том, как создавать объекты кода вручную и как их снова дизассемблировать:
Объекты кода описаны здесь:
Объекты кода представляют собой байт-скомпилированные исполняемый код Python или байт-код. Разница между кодовым объектом и функциональный объект состоит в том, что функциональный объект содержит явный ссылка на функции globals (модуль, в котором он был определен), в то время как объект кода не содержит контекст; также аргумент по умолчанию значения сохраняются в функции объект, а не объект кода (потому что они представляют значения рассчитанный во время выполнения). В отличие от объекты-объекты, объекты кода неизменен и не содержит ссылок (прямо или косвенно) к изменяемым объекты.