справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Глава 13 . Службы Python времени выполнения В этой главе описываются модули, связанные с особенностями работы ин- терпретатора Python. Здесь рассматриваются такие темы, как сборка му- Python. Здесь рассматриваются такие темы, как сборка му- . Здесь рассматриваются такие темы, как сборка му- сора, основы управления объектами (копирование, сериализация и так да- лее), слабые ссылки и окружение интерпретатора. Модуль atexit Модуль atexit используется для регистрации функций, которые должны вызываться интерпретатором перед завершением работы. Он предоставля- ет единственную функцию: register(func [,args [,kwargs]]) Добавляет функцию func в список функций, которые должны вызывать- ся интерпретатором перед завершением работы. args – кортеж аргументов, которые будут переданы функции func. kwargs – словарь именованных ар- гументов. Функция будет вызвана как func(*args,**kwargs). Функции будут вызываться в порядке, обратном порядку регистрации (функция, зареги- стрированная последней, будет вызвана первой). Если в процессе выпол- нения функции возникнет исключение, сообщение будет выведено в поток стандартного вывода, но само исключение будет проигнорировано. Модуль copy Модуль copy предоставляет функции создания поверхностных и глубоких копий составных объектов, включая списки, кортежи, словари и экзем- пляры пользовательских объектов. copy(x) Создает поверхностную копию объекта x за счет создания нового состав- ного объекта и копирования элементов объекта x по ссылке. Для объектов встроенных типов эту функцию использовать не принято. Вместо этого обычно вызываются функции list(x), dict(x), set(x) и так далее, которые Модуль gc 281 создают поверхностные копии аргумента x (следует отметить, что прямые обращения к именам типов, подобно приведенным, кроме всего прочего, выполняются значительно быстрее, чем функция copy()). deepcopy(x [, visit]) Создает глубокую копию объекта x за счет создания нового составного объ- екта и рекурсивного копирования всех атрибутов объекта x. Необязатель- ный аргумент visit – это словарь, который используется для запоминания посещенных объектов, чтобы избежать зацикливания при копировании рекурсивных структур данных. Этот аргумент обычно указывается, толь- ко если deepcopy() вызывается рекурсивно, как описано ниже в этой главе. Хотя обычно это не требуется, тем не менее класс может реализовать соб- ственные версии методов копирования, в виде методов __copy__(self) и __ deepcopy__( self, visit) – для поверхностного и глубокого копирования соот- ветственно. Метод __deepcopy__() должен принимать словарь visit, который служит для запоминания объектов, встретившихся в процессе копирова- ния. Все, что метод __deepcopy__() должен сделать со словарем visit, – это передать его другим вызовам функции deepcopy(), присутствующим в реа- лизации метода (если таковые имеются). Если класс реализует методы __getstate__() и __setstate__(), которые ис- пользуются модулем pickle, для создания копий модулем copy будут ис- пользоваться эти методы. Примечания • Этот модуль может использоваться для работы с простыми типами, та- кими как целые числа и строки, однако в этом нет никакой необходи- мости. • Функции копирования не могут применяться к модулям, объектам классов, функциям, методам, к объектам с трассировочной информаци- ей, кадрам стека, файлам, сокетам и к другим подобным типам. Когда объект не может быть скопирован, возбуждается исключение copy.error. Модуль gc Модуль gc предоставляет интерфейс управления сборщиком мусора, спо- собным обнаруживать циклические ссылки в объектах, таких как списки, кортежи, словари, и в экземплярах других классов. При создании объек- тов различных контейнерных типов они заносятся во внутренний список интерпретатора. Всякий раз, когда контейнерный объект уничтожается, он удаляется из этого списка. Когда количество операций создания новых объектов превысит количество удалений объектов на некоторое пороговое значение, определяемое пользователем, запускается сборщик мусора. Сбор- щик мусора просматривает этот список и выявляет коллекции объектов, которые больше не используются, но еще не были удалены из-за наличия циклических ссылок. Кроме того, сборщик мусора использует трехуровне- вую схему сборки мусора разных поколений, когда объекты, пережившие первый этап сборки мусора, помещаются в списки объектов, которые про- 282 Глава 13. Службы Python времени выполнения веряются реже. Благодаря этому обеспечивается более высокая производи- тельность для программ с большим количеством долгоживущих объектов. collect([generation]) Запускает полную сборку мусора. Эта функция проверяет все поколения и возвращает количество обнаруженных недоступных объектов. В необя- зательном аргументе generation передается целое число в диапазоне 0–2, которое определяет номер поколения, в котором будет выполняться сборка мусора. disable() Отключает механизм сборки мусора. enable() Включает механизм сборки мусора. garbage Переменная, содержащая доступный только для чтения список экзем- пляров пользовательских классов, которые больше не используются, но которые не могут быть удалены, потому что они связаны циклическими ссылками и имеют метод __del__(). Такие объекты не могут быть удалены сборщиком мусора, так как, чтобы разорвать циклическую связь, интер- претатор должен сначала произвольно удалить один из объектов. При этом не существует надежного способа определить, должен ли метод __del__() остающегося объекта, вовлеченного в циклическую ссылку, выполнить какие-то важные операции над объектом, который только что был удален. get_count() Возвращает кортеж (count0, count1, count2) с текущим количеством объ- ектов в каждом поколении. get_debug() Возвращает текущие состояния флагов отладки. get_objects() Возвращает список всех объектов, находящихся под контролем сборщика мусора. За исключением возвращаемого списка. get_referrers(obj1, obj2, ...) Возвращает список всех объектов, которые непосредственно ссылаются на объекты obj1, obj2 и так далее. Возвращаемый список может содержать объекты, которые еще не были утилизированы сборщиком мусора, а также объекты, находящиеся в стадии создания. get_referents(obj1, obj2, ...) Возвращает список объектов, на которые ссылаются объекты obj1, obj2 и так далее. Например, если obj1 является контейнером, для него будет воз- вращен список объектов, содержащихся в нем. get_threshold() Возвращает кортеж с текущими пороговыми значениями запуска сборщи- ка мусора. Модуль inspect 283 isenabled() Возвращает True, если механизм сборки мусора включен. set_debug(flags) Устанавливает отладочные флаги сборщика мусора, которые могут исполь- отладочные флаги сборщика мусора, которые могут исполь- отладочные флаги сборщика мусора, которые могут исполь- флаги сборщика мусора, которые могут исполь- флаги сборщика мусора, которые могут исполь- сборщика мусора, которые могут исполь- сборщика мусора, которые могут исполь- мусора, которые могут исполь- мусора, которые могут исполь- , которые могут исполь- которые могут исполь- могут исполь- могут исполь- исполь- исполь- зоваться для отладки поведения сборщика мусора. В аргументе flags пере- пере- дается целое число, составленное с помощью битовой операции ИЛИ из констант DEBUG_STATS, DEBUG_COLLECTABLE, DEBUG_UNCOLLECTABLE, DEBUG_INSTANCES, DEBUG_OBJECTS , DEBUG_SAVEALL и DEBUG_LEAK. Флаг DEBUG_LEAK является, пожа- луй, наиболее полезным, потому что он вынуждает механизм сборщика мусора выводить информацию, которая может пригодиться при отладке программ с утечками памяти. set_threshold(threshold0 [, threshold1[, threshold2]]) Устанавливает частоту запуска сборщика мусора. Объекты распределяют- ся по трем поколениям, где поколение 0 содержит самые молодые объекты, а поколение 2 – самые старые. Объекты, пережившие этап сборки мусора, перемещаются в следующее, более старшее поколение. Достигнув поко- поко- поко- ления 2, объект остается в нем. В аргументе threshold0 передается число, разность между количеством операций создания новых объектов и количе- ством операций удаления объектов, по достижении которого запускается сборка мусора среди объектов поколения 0. В аргументе threshold1 переда- ется число, определяющее количество запусков процедуры сборки мусора среди объектов поколения 0, по достижении которого запускается сборка мусора среди объектов поколения 1. В аргументе threshold2 передается чис- ло, определяющее количество запусков процедуры сборки мусора среди объектов поколения 1, по достижении которого запускается сборка мусора среди объектов поколения 2. По умолчанию используются пороговые зна- чения (700,10,10). Если в аргументе threshold0 передать значение 0, сборка мусора будет отключена. Примечания • Объекты, связанные циклическими ссылками и имеющие метод __ del__() , не утилизируются сборщиком мусора и помещаются в список gc.garbage (объекты, которые не могут быть удалены). Эти объекты не удаляются из-за сложностей, связанных с необходимостью выполнения заключительных операций этими объектами. • Функции get_referrers() и get_referents() применяются только к объек- там, поддерживающим сборку мусора. Кроме того, эти функции пред- назначены только для отладки. Они не должны использоваться в каких- либо других целях. Модуль inspect Модуль inspect используется для сбора информации о существующих объ- ектах, такой как имена и значения атрибутов, строки документирования, исходный программный код, кадры стеков и так далее. 284 Глава 13. Службы Python времени выполнения cleandoc(doc) Приводит в порядок строку документирования doc, замещая все символы табуляции пробелами и удаляя отступы, которые могли быть добавлены, чтобы выровнять строку документирования в соответствии с другими ин- струкциями в функции или в методе. currentframe() Возвращает объект кадра стека, соответствующий кадру стека вызываю- щей функции. formatargspec(args [, varags [, varkw [, defaults]]]) Возвращает отформатированную строку, представляющую значения, воз- вращаемые функцией getargspec(). formatargvalues(args [, varargs [, varkw [, locals]]]) Возвращает отформатированную строку, представляющую значения, воз- вращаемые функцией getargvalues(). getargspec(func) Для заданной функции func возвращает именованный кортеж ArgSpec(args, varargs, varkw, defaults) , где args – это список имен аргументов функции func , varargs – имя аргумента, начинающегося с символа * (если имеется), varkw – имя аргумента, начинающегося с символов ** (если имеется), и de- faults – кортеж значений по умолчанию для аргументов или None, если ар- гументы со значениями по умолчанию отсутствуют. Если в функции func имеются аргументы со значениями по умолчанию, кортеж defaults пред- ставляет значения последних n аргументов в списке args, где n – результат вызова функции len(defaults). getargvalues(frame) Возвращает значения аргументов, переданных функции с кадром стека frame . Возвращает кортеж ArgInfo(args, varargs, varkw, locals), где args – список имен аргументов, varargs – имя аргумента, начинающегося с сим- вола * (если имеется), varkw – имя аргумента, начинающегося с символов ** (если имеется), и locals – локальный словарь кадра стека. getclasstree(classes [, unique]) Получая список classes связанных классов, эта функция воссоздает иерар- хию их наследования. Иерархия представлена как коллекция вложенных списков, где каждый элемент списка является списком классов, насле- дующих класс, непосредственно предшествующий этому списку. Каж- дый элемент вложенного списка является кортежем из 2 элементов (cls, bases) , где cls – объект класса, а bases – кортеж базовых классов. Если в ар- гументе unique передается значение True, каждый класс будет включаться в возвращаемый список только один раз. В противном случае, когда ис- пользуется множественное наследование, класс может появляться в спи- ске несколько раз. getcomments(object) Возвращает строку, содержащую комментарии, непосредственно предше- ствующие объявлению объекта object в исходном программном коде на Модуль inspect 285 языке Python. Если объект является модулем, возвращаются коммента- Python. Если объект является модулем, возвращаются коммента- . Если объект является модулем, возвращаются коммента- рии, расположенные в начале модуля. В случае отсутствия комментариев возвращается None. getdoc(object) Возвращает строку документирования объекта object. Перед этим строка документирования обрабатывается функцией cleandoc(). getfile(object) Возвращает имя файла, в котором находится определение объекта object. Может вернуть TypeError, если эта информация не имеет смысла или недо- ступна (например, для встроенных функций). getframeinfo(frame [, context]) Возвращает именованный кортеж Traceback(filename, lineno, function, code_ context, index), содержащий сведения об объекте frame с информацией о ка- дре стека. Поля filename и lineno определяют местоположение в исходном программном коде. Аргумент context определяет количество строк кон- текста, которые будут извлекаться из исходного программного кода. Поле code_context в возвращаемом кортеже содержит список строк, составляю- щих контекст. Поле index – числовой индекс строки в этом списке, соответ- ствующей кадру стека. getinnerframes(traceback [, context]) Возвращает список записей в кадре стека для кадра объекта traceback с трассировочной информацией и для всех вложенных кадров. Каждая за- пись является кортежем из 6 элементов (frame, filename, lineno, funcname, code_ context, index). Поля filename, lineno, context, code_context и index име- ют тот же смысл, что и в кортеже, возвращаемом функцией getframeinfo(). getmembers(object [, predicate]) Возвращает все атрибуты объекта object. Обычно атрибуты выбираются с помощью атрибута __dict__ объекта, но эта функция может возвращать атрибуты, хранящиеся в других местах (например, строку документирова- ния – из атрибута __doc__, имя объекта – из атрибута __name__ и так далее). Атрибуты возвращаются в виде списка пар (name, value). В необязательном аргументе predicate можно передать функцию, которая принимает атри- бут объекта в качестве аргумента и возвращает True или False. В этом слу- чае в список будут включены только те атрибуты, для которых функция predicate вернет True. В качестве функции predicate можно использовать та- кие функции, как isfunction() и isclass(). getmodule(object) Возвращает модуль, в котором был объявлен объект object (если это воз- можно). getmoduleinfo(path) Возвращает информацию о том, как Python интерпретирует путь к фай- Python интерпретирует путь к фай- интерпретирует путь к фай- лу path. Если path не является модулем Python, возвращается None. В про- тивном случае возвращается именованный кортеж ModuleInfo(name, suffix, mode, module_type), где name – это имя модуля, suffix – расширение имени 286 Глава 13. Службы Python времени выполнения файла, mode – режим открытия файла модуля и module_type – целочислен- ный код, определяющий тип модуля. Коды типов модулей определены в модуле imp как: Тип модуля Описание imp.PY_SOURCE Файл с исходным программным кодом на языке Python imp.PY_COMPILED Скомпилированный файл с байт-кодом imp.C_EXTENSION Динамически загружаемое расширение, написанное на языке C imp.PKG_DIRECTORY Каталог пакета imp.C_BUILTIN Встроенный модуль imp.PY_FROZEN Фиксированный модуль getmodulename(path) Возвращает имя модуля, заданного путем path. Если аргумент path не вы- глядит как модуль Python, возвращается None. getmro(cls) Возвращает кортеж классов, который является представлением поряд- ка поиска методов в классе cls. Дополнительные подробности приводятся в главе 7 «Классы и объектно-ориентированное программирование». getouterframes(frame [, context]) Возвращает список записей из текущего кадра стека и всех объемлющих кадров. Этот список является представлением последовательности вызо- вов функций, где первый элемент содержит информацию о кадре стека. Каждая запись является кортежем из 6 элементов (frame, filename, lineno, funcname, code_context, index) , поля которого имеют тот же смысл, что и в кортеже, возвращаемом функцией getinnerframes(). Аргумент context имеет то же назначение, что и в функции getframeinfo(). |