Подтвердить что ты не робот

Что такое объект кода Python?

При попытке использовать инструкцию "exec" Python, я получил следующую ошибку:

TypeError: exec: arg 1 must be a string, file, or code object

Я не хочу передавать строку или файл, но что такое объект кода и как его создать?

4b9b3361

Ответ 1

Один из способов создания объекта кода - использовать встроенную функцию 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>

Ответ 2

Существует замечательная запись в блоге Дэн Кроста, объясняющая эту тему, в том числе о том, как создавать объекты кода вручную и как их снова дизассемблировать:

Изучение объектов кода Python

Ответ 3

Объекты кода описаны здесь:

Объекты кода представляют собой байт-скомпилированные исполняемый код Python или байт-код. Разница между кодовым объектом и функциональный объект состоит в том, что функциональный объект содержит явный ссылка на функции globals (модуль, в котором он был определен), в то время как объект кода не содержит контекст; также аргумент по умолчанию значения сохраняются в функции объект, а не объект кода (потому что они представляют значения рассчитанный во время выполнения). В отличие от объекты-объекты, объекты кода неизменен и не содержит ссылок (прямо или косвенно) к изменяемым объекты.