Стандартна ієрархія типів
Оновлено: 28.04.2023
Нижче наведено список типів, вбудованих у Python. Модулі розширення (написані мовами C, Java або іншими мовами, залежно від реалізації) можуть визначати додаткові типи. Майбутні версії Python можуть додавати типи до ієрархії типів (наприклад, раціональні числа, ефективно збережені масиви цілих чисел тощо), хоча такі доповнення часто надаватимуться через стандартну бібліотеку.
Деякі з наведених нижче описів типів містять абзац із переліком «спеціальних атрибутів». Це атрибути, які надають доступ до реалізації і не призначені для загального використання. У майбутньому їх визначення може змінитися.
Жодного
Цей тип має єдине значення. Існує єдиний об’єкт із таким значенням. Доступ до цього об’єкта здійснюється через вбудоване ім’я None. Він використовується для позначення відсутності значення в багатьох ситуаціях, наприклад, його повертають функції, які явно нічого не повертають. Його значення істинності є хибним.
Не впроваджений
Цей тип має єдине значення. Існує єдиний об’єкт із таким значенням. Доступ до цього об’єкта здійснюється через вбудовану назву NotImplemented. Числові методи та методи насиченого порівняння повинні повертати це значення, якщо вони не реалізують операцію для наданих операндів. (Тоді інтерпретатор спробує відображену операцію або інший резервний варіант, залежно від оператора.) Його не слід оцінювати в логічному контексті.
Перегляньте Реалізація арифметичних дій для отримання додаткової інформації.
Змінено в версії 3.9: Оцінка NotImplemented у логічному контексті застаріла. Хоча наразі він оцінюється як істинний, він видасть DeprecationWarning. Це викличе TypeError у наступній версії Python.
Еліпсис
Цей тип має єдине значення. Існує єдиний об’єкт із таким значенням. Доступ до цього об’єкта здійснюється за допомогою літералу ... або вбудованої назви Ellipsis. Його істинна цінність є істинною.
numbers.Number
Вони створюються за допомогою числових літералів і повертаються як результати арифметичними операторами та арифметичними вбудованими функціями. Числові об’єкти незмінні; після створення їхня цінність ніколи не змінюється. Числа Python, звичайно, тісно пов’язані з математичними числами, але підлягають обмеженням числового представлення в комп’ютерах.
Рядкові представлення числових класів, обчислені за допомогою __repr__() і __str__(), мають такі властивості:
Це дійсні числові літерали, які, коли їх передають конструктору класу, створюють об’єкт, що має значення вихідного числа.
Представлення в базі 10, коли це можливо.
Початкові нулі, можливо, за винятком одного нуля перед десятковою комою, не показані.
Кінцеві нулі, можливо, за винятком одного нуля після коми, не відображаються.
Знак відображається лише тоді, коли число від’ємне.
Python розрізняє цілі числа, числа з плаваючою комою та комплексні числа:
числа.Інтеграл
Вони представляють елементи з математичного набору цілих чисел (додатних і від’ємних).
Є два типи цілих чисел:
Цілі числа (int)
Вони представляють числа в необмеженому діапазоні, що залежить лише від доступної (віртуальної) пам’яті. Для цілей операцій зсуву та маски передбачається двійкове представлення, а від’ємні числа представлені у варіанті доповнення до 2, що створює ілюзію нескінченного рядка знакових бітів, що тягнеться вліво.
Логічні значення (bool)
Вони представляють істинні значення False і True. Два об’єкти, що представляють значення False і True, є єдиними логічними об’єктами. Логічний тип є підтипом цілочисельного типу, а логічні значення поводяться як значення 0 і 1 відповідно майже в усіх контекстах, за винятком того, що при перетворенні на рядок рядки "False" або "True" повертаються відповідно.
Правила подання цілих чисел мають на меті дати найбільш змістовну інтерпретацію операцій зсуву та маски, що включають від’ємні цілі числа.
numbers.Real (float)
Вони представляють числа з плаваючою комою подвійної точності на рівні машини. Ви залежите від базової архітектури машини (і реалізації C або Java) щодо прийнятного діапазону та обробки переповнення. Python не підтримує числа з плаваючою комою одинарної точності; економія використання процесора та пам’яті, яка зазвичай є причиною їх використання, є меншою за накладні витрати на використання об’єктів у Python, тому немає причин ускладнювати мову двома видами чисел з плаваючою комою.
numbers.Complex (complex)
Вони представляють комплексні числа як пару чисел з плаваючою комою подвійної точності на рівні машини. Застосовуються ті самі застереження, що й для чисел з плаваючою комою. Дійсні та уявні частини комплексного числа z можна отримати за допомогою атрибутів z.real і z.imag, доступних лише для читання.
Послідовності
Вони представляють скінченні впорядковані набори, проіндексовані невід’ємними числами. Вбудована функція len() повертає кількість елементів послідовності. Якщо довжина послідовності дорівнює n, набір індексів містить числа 0, 1, …, n-1. Елемент i послідовності a вибрано за допомогою a[i].
Послідовності також підтримують нарізку: a[i:j] вибирає всі елементи з індексом k так, що i <= k < j. Коли використовується як вираз, фрагмент є послідовністю одного типу. Це означає, що набір індексів перенумеровано так, що він починається з 0.
Деякі послідовності також підтримують «розширене нарізання» з третім параметром «кроку»: a[i:j:k] вибирає всі елементи a з індексом x, де x = i + n*k ``, *n* ``>= 0 і i <= x < j.
Послідовності розрізняють відповідно до їх мінливості:
Незмінні послідовності
Об’єкт типу незмінної послідовності не може змінюватися після створення. (Якщо об’єкт містить посилання на інші об’єкти, ці інші об’єкти можуть бути змінними та змінюватися; однак набір об’єктів, на який безпосередньо посилається незмінний об’єкт, не може змінитися.)
Наступні типи є незмінними послідовностями:
рядки
A string is a sequence of values that represent Unicode code points. All the code points in the range U+0000 - U+10FFFF can be represented in a string. Python doesn’t have a char type; instead, every code point in the string is represented as a string object with length 1. The built-in function ord() converts a code point from its string form to an integer in the range 0 - 10FFFF; chr() converts an integer in the range 0 - 10FFFF to the corresponding length 1 string object. str.encode() can be used to convert a str to bytes using the given text encoding, and bytes.decode() can be used to achieve the opposite.
Кортежі
Елементи кортежу є довільними об’єктами Python. Кортежі з двох або більше елементів утворюються списками виразів, розділених комами. Кортеж з одного елемента («синглтон») може бути сформований шляхом додавання коми до виразу (вираз сам по собі не створює кортеж, оскільки дужки повинні використовуватися для групування виразів). Порожній кортеж може бути утворений пустою парою круглих дужок.
Байти
Об’єкт bytes є незмінним масивом. Елементи є 8-бітовими байтами, представленими цілими числами в діапазоні 0 <= x < 256. Байтові літерали (наприклад, b'abc) і вбудований конструктор bytes() можуть бути використовується для створення об’єктів bytes. Крім того, об’єкти bytes можна декодувати в рядки за допомогою методу decode().
Змінні послідовності
Змінні послідовності можна змінювати після їх створення. Нотації підписки та зрізу можна використовувати як ціль операторів призначення та del (видалити).
На даний момент існує два типи внутрішніх змінних послідовностей:
списки
Елементи списку є довільними об’єктами Python. Списки формуються шляхом розміщення списку виразів, розділених комами, у квадратних дужках. (Зауважте, що для формування списків довжиною 0 або 1 не потрібні особливі випадки.)
Байтові масиви
Об’єкт bytearray є змінним масивом. Вони створюються за допомогою вбудованого конструктора bytearray(). Крім того, що байтові масиви є змінними (і, отже, нехешованими), байтові масиви забезпечують той самий інтерфейс і функціональність, що й незмінні об’єкти bytes.
Модуль розширення array надає додатковий приклад змінного типу послідовності, як і модуль collections.
Встановити типи
Вони представляють невпорядковані, кінцеві набори унікальних, незмінних об’єктів. Таким чином, вони не можуть бути індексовані жодним індексом. Однак їх можна повторювати, а вбудована функція len() повертає кількість елементів у наборі. Набори зазвичай використовують для швидкого тестування членства, видалення дублікатів із послідовності та обчислення математичних операцій, таких як перетин, об’єднання, різниця та симетрична різниця.
Для елементів набору застосовуються ті ж правила незмінності, що й для ключів словника. Зауважте, що числові типи підкоряються звичайним правилам числового порівняння: якщо два числа порівнюються (наприклад, 1 і 1.0), лише одне з них може міститися в наборі.
Наразі існує два типи внутрішніх наборів:
Набори
Вони представляють змінний набір. Вони створюються за допомогою вбудованого конструктора set() і можуть бути змінені згодом кількома методами, наприклад add().
Заморожені набори
Вони являють собою незмінний набір. Вони створюються за допомогою вбудованого конструктора frozenset(). Оскільки заморожений набір є незмінним і hashable, його можна знову використовувати як елемент іншого набору або як ключ словника.
Відображення
Вони представляють кінцеві набори об’єктів, індексованих довільними наборами індексів. Підрядкова нотація a[k] вибирає елемент з індексом k із відображення a; це можна використовувати у виразах і як ціль присвоєння або операторів del. Вбудована функція len() повертає кількість елементів у відображенні.
Наразі існує єдиний внутрішній тип відображення:
словники
Вони представляють кінцеві набори об’єктів, індексованих майже довільними значеннями. Єдиними типами значень, неприйнятними як ключі, є значення, що містять списки, словники чи інші змінні типи, які порівнюються за значенням, а не за ідентичністю об’єкта, тому що для ефективної реалізації словників необхідно, щоб хеш-значення ключа залишалося постійним. Числові типи, що використовуються для ключів, підкоряються звичайним правилам для числового порівняння: якщо два числа порівнюються (наприклад, 1 і 1.0), тоді їх можна використовувати як взаємозамінні для індексування тієї самої статті словника.
Словники зберігають порядок вставки, тобто ключі створюватимуться в тому самому порядку, у якому вони були послідовно додані до словника. Заміна існуючого ключа не змінює порядок, однак видалення ключа та його повторне вставлення додасть його в кінець замість збереження старого місця.
Словники змінні; їх можна створити за допомогою нотації {...} (див. розділ Відображення словника).
Модулі розширення dbm.ndbm і dbm.gnu надають додаткові приклади типів зіставлення, як і модуль collections.
Змінено в версії 3.7: Словники не зберігали порядок вставки у версіях Python до 3.6. У CPython 3.6 порядок вставки було збережено, але в той час це вважалося деталлю реалізації, а не гарантією мови.
Викличні типи
Це типи, до яких можна застосувати операцію виклику функції (див. розділ Дзвінки):
Визначені користувачем функції
Визначений користувачем об’єкт функції створюється визначенням функції (див. розділ Визначення функцій). Її слід викликати зі списком аргументів, що містить таку саму кількість елементів, як і формальний список параметрів функції.
Особливі атрибути:
Атрибут
Значення
__doc__
Рядок документації функції або None, якщо недоступний; не успадковується підкласами.
Можливість запису
__ім'я__
Ім’я функції.
Можливість запису
__qualname__
qualified name функції.
Нове в версії 3.3.
Можливість запису
__module__
Назва модуля, у якому була визначена функція, або «Немає», якщо вона недоступна.
Можливість запису
__defaults__
Кортеж, що містить значення аргументів за замовчуванням для тих аргументів, які мають значення за замовчуванням, або None, якщо жоден аргумент не має значення за замовчуванням.
Можливість запису
__code__
Об’єкт коду, що представляє скомпільоване тіло функції.
Можливість запису
__globals__
Посилання на словник, який містить глобальні змінні функції — глобальний простір імен модуля, у якому було визначено функцію.
Лише для читання
__dict__
Простір імен, що підтримує довільні атрибути функції.
Можливість запису
__closure__
None або кортеж клітинок, які містять зв’язки для вільних змінних функції. Дивіться нижче інформацію про атрибут cell_contents.
Лише для читання
__annotations__
Dict, що містить анотації параметрів. Ключі dict — це назви параметрів і 'return' для анотації повернення, якщо є. Для отримання додаткової інформації про роботу з цим атрибутом перегляньте Рекомендації щодо анотацій.
Можливість запису
__kwdefaults__
Dict, що містить параметри за замовчуванням лише для ключових слів.
Можливість запису
Більшість атрибутів із позначкою «Writable» перевіряють тип присвоєного значення.
Функціональні об’єкти також підтримують отримання та встановлення довільних атрибутів, які можна використовувати, наприклад, для додавання метаданих до функцій. Для отримання та встановлення таких атрибутів використовується звичайна крапкова нотація. Зауважте, що поточна реалізація підтримує лише атрибути функцій для визначених користувачем функцій. Атрибути вбудованих функцій можуть підтримуватися в майбутньому.
Об’єкт клітинки має атрибут cell_contents. Це можна використовувати для отримання значення комірки, а також для встановлення значення.
Додаткову інформацію про визначення функції можна отримати з її об’єкта коду; дивіться опис внутрішніх типів нижче. Доступ до типу cell можна отримати в модулі types.
Методи екземплярів
Об’єкт методу екземпляра поєднує в собі клас, екземпляр класу та будь-який об’єкт, що викликається (зазвичай це функція, визначена користувачем).
Спеціальні атрибути лише для читання: __self__ — об’єкт екземпляра класу, __func__ — об’єкт функції; __doc__ — це документація методу (те саме, що __func__.__doc__); __name__ — назва методу (те саме, що __func__.__name__); __module__ — це назва модуля, у якому було визначено метод, або None, якщо воно недоступне.
Методи також підтримують доступ (але не встановлення) довільних атрибутів функції на базовому об’єкті функції.
Визначені користувачем об’єкти методу можуть бути створені під час отримання атрибута класу (можливо, через екземпляр цього класу), якщо цей атрибут є визначеним користувачем об’єктом функції або об’єктом методу класу.
Коли об’єкт методу екземпляра створюється шляхом отримання визначеного користувачем об’єкта функції з класу через один із його екземплярів, його атрибут __self__ є екземпляром, а об’єкт методу вважається зв’язаним. Атрибут __func__ нового методу є оригінальним об’єктом функції.
Коли об’єкт методу екземпляра створюється шляхом отримання об’єкта методу класу з класу або екземпляра, його атрибут __self__ є самим класом, а його атрибут __func__ є об’єктом функції, що лежить в основі методу класу.
Коли викликається об’єкт методу екземпляра, викликається базова функція (__func__), вставляючи екземпляр класу (__self__) перед списком аргументів. Наприклад, коли C є класом, який містить визначення для функції f(), а x є екземпляром C, виклик x.f(1 ) еквівалентно виклику C.f(x, 1).
Коли об’єкт методу екземпляра походить від об’єкта методу класу, «примірник класу», який зберігається в __self__, фактично буде самим класом, тому виклик x.f(1) або C.f( 1)`` еквівалентно виклику f(C,1), де f є основною функцією.
Зауважте, що перетворення з об’єкта функції в об’єкт методу екземпляра відбувається щоразу, коли атрибут отримується з екземпляра. У деяких випадках плідною оптимізацією є призначення атрибута локальній змінній і виклик цієї локальної змінної. Також зауважте, що це перетворення відбувається лише для визначених користувачем функцій; інші викликані об’єкти (і всі невикликові об’єкти) витягуються без перетворення. Також важливо відзначити, що визначені користувачем функції, які є атрибутами примірника класу, не перетворюються на зв’язані методи; це тільки трапляється, коли функція є атрибутом класу.
Функції генератора
Функція або метод, який використовує оператор yield (див. розділ Оператор yield), називається функцією-генератором. Під час виклику така функція завжди повертає об’єкт iterator, який можна використовувати для виконання тіла функції: виклик методу iterator.__next__() ітератора призведе до виконання функції, доки вона не надасть значення за допомогою оператора yield. Коли функція виконує оператор return або виходить з кінця, виникає виняток StopIteration, і ітератор досягне кінця набору значень, які потрібно повернути.
Функції співпрограми
Функція або метод, визначений за допомогою async def, називається coroutine function. Така функція під час виклику повертає об’єкт coroutine. Він може містити вирази await, а також оператори async with і async for. Дивіться також розділ Об’єкти співпрограми.
Функції асинхронного генератора
Функція або метод, визначений за допомогою async def і який використовує оператор yield, називається функцією асинхронного генератора. Під час виклику така функція повертає об’єкт asynchronous iterator, який можна використовувати в операторі async for для виконання тіла функції.
Виклик методу aiterator.__anext__ асинхронного ітератора поверне awaitable, який у разі очікування виконуватиметься, доки не надасть значення за допомогою виразу yield. Коли функція виконує порожній оператор return або виходить за межі кінця, виникає виняткова ситуація StopAsyncIteration, і асинхронний ітератор досягне кінця набору значень, які потрібно отримати.
Вбудовані функції
Вбудований об’єкт функції є оболонкою навколо функції C. Прикладами вбудованих функцій є len() і math.sin() (math є стандартним вбудованим модулем). Кількість і тип аргументів визначається функцією C. Спеціальні атрибути лише для читання: __doc__ — рядок документації функції або None, якщо він недоступний; __name__ це ім’я функції; __self__ має значення None (але дивіться наступний пункт); __module__ — це ім’я модуля, у якому була визначена функція, або None, якщо воно недоступне.
Вбудовані методи
Це дійсно інше маскування вбудованої функції, цього разу містить об’єкт, переданий у функцію C як неявний додатковий аргумент. Прикладом вбудованого методу є alist.append(), припускаючи, що alist є об’єктом списку. У цьому випадку спеціальний атрибут лише для читання __self__ встановлюється для об’єкта, позначеного alist.
Заняття
Заняття викликні. Ці об’єкти зазвичай діють як фабрики для нових екземплярів самих себе, але можливі варіанти для типів класів, які перевизначають __new__(). Аргументи виклику передаються до __new__() і, у типовому випадку, до __init__() для ініціалізації нового екземпляра.
Екземпляри класу
Екземпляри довільних класів можна зробити викликаними, визначивши метод __call__() у їхньому класі.
Модулі
Модулі є основною організаційною одиницею коду Python і створюються системою імпорту, яка викликається оператором import або викликом функцій, таких як importlib.import_module() і вбудований __import__(). Об’єкт модуля має простір імен, реалізований об’єктом словника (це словник, на який посилається атрибут __globals__ функцій, визначених у модулі). Посилання на атрибути перекладено на пошуки в цьому словнику, наприклад, m.x еквівалентно m.__dict__["x"]. Об’єкт модуля не містить об’єкт коду, який використовується для ініціалізації модуля (оскільки він не потрібен після завершення ініціалізації).
Призначення атрибутів оновлює словник простору імен модуля, наприклад, m.x = 1 еквівалентно m.__dict__["x"] = 1.
Попередньо визначені (записувані) атрибути:
__name__
Назва модуля.
__doc__
Рядок документації модуля або None, якщо він недоступний.
__file__
Шлях до файлу, з якого було завантажено модуль, якщо він був завантажений із файлу. Атрибут __file__ може бути відсутнім для певних типів модулів, таких як модулі C, які статично пов’язані з інтерпретатором. Для модулів розширення, які динамічно завантажуються зі спільної бібліотеки, це шлях до файлу спільної бібліотеки.
__annotations__
Словник, що містить анотації змінних, зібрані під час виконання тіла модуля. Найкращі методи роботи з __annotations__ див. Рекомендації щодо анотацій.
Спеціальний атрибут лише для читання: __dict__ — це простір імен модуля як об’єкт словника.
Деталі реалізації CPython: Через те, як CPython очищає словники модулів, словник модуля буде очищено, коли модуль виходить із області видимості, навіть якщо в словнику все ще є живі посилання. Щоб уникнути цього, скопіюйте словник або збережіть модуль, використовуючи його словник безпосередньо.
Спеціальні заняття
Спеціальні типи класів зазвичай створюються визначеннями класів (див. розділ Визначення класів). Клас має простір імен, реалізований об’єктом словника. Посилання на атрибути класу перекладаються на пошуки в цьому словнику, наприклад, C.x перекладається на C.__dict__["x"] (хоча є ряд хуків, які дозволяють інші способи пошуку атрибутів) . Якщо ім’я атрибута там не знайдено, пошук атрибута продовжується в базових класах. Цей пошук базових класів використовує порядок розв’язання методів C3, який поводиться правильно навіть за наявності «діамантових» структур успадкування, де є кілька шляхів успадкування, що ведуть до спільного предка. Додаткову інформацію про C3 MRO, який використовує Python, можна знайти в документації, що супроводжує випуск 2.3, за адресою https://www.python.org/downloa....
Коли посилання на атрибут класу (наприклад, для класу C) дає об’єкт методу класу, воно перетворюється на об’єкт методу екземпляра, чий атрибут __self__ є C. Коли він дає об’єкт статичного методу, він перетворюється на об’єкт, обгорнутий об’єктом статичного методу. Перегляньте розділ Реалізація дескрипторів щодо іншого способу, яким атрибути, отримані з класу, можуть відрізнятися від тих, що насправді містяться в його __dict__.
Призначення атрибутів класу оновлює словник класу, а не словник базового класу.
Об’єкт класу можна викликати (див. вище), щоб створити екземпляр класу (див. нижче).
Особливі атрибути:
__name__
Назва класу.
__module__
Ім’я модуля, в якому було визначено клас.
__dict__
Словник, що містить простір імен класу.
__bases__
Кортеж, що містить базові класи в порядку їх появи в списку базових класів.
__doc__
Рядок документації класу або None, якщо не визначено.
__annotations__
Словник, що містить анотації змінних, зібрані під час виконання тіла класу. Найкращі методи роботи з __annotations__ див. Рекомендації щодо анотацій.
Екземпляри класу
Екземпляр класу створюється шляхом виклику об’єкта класу (див. вище). Екземпляр класу має простір імен, реалізований як словник, який є першим місцем, у якому здійснюється пошук посилань на атрибути. Якщо атрибут там не знайдено, а клас екземпляра має атрибут із таким іменем, пошук продовжується з атрибутами класу. Якщо знайдено атрибут класу, який є визначеним користувачем об’єктом функції, він перетворюється на об’єкт методу екземпляра, атрибут __self__ якого є екземпляром. Статичний метод і об’єкти методу класу також трансформуються; див. вище в розділі «Класи». Перегляньте розділ Реалізація дескрипторів щодо іншого способу, яким атрибути класу, отримані через його екземпляри, можуть відрізнятися від об’єктів, які насправді зберігаються в __dict__ класу. Якщо атрибут класу не знайдено, а клас об’єкта має метод __getattr__(), який викликається для виконання пошуку.
Призначення та видалення атрибутів оновлюють словник екземпляра, а не словник класу. Якщо клас має метод __setattr__() або __delattr__(), він викликається замість безпосереднього оновлення словника примірника.
Екземпляри класу можуть видавати себе за числа, послідовності або відображення, якщо вони мають методи з певними спеціальними назвами. Дивіться розділ Назви спеціальних методів.
Спеціальні атрибути: __dict__ — це словник атрибутів; __class__ є класом екземпляра.
Об’єкти введення-виведення (також відомі як файлові об’єкти)
file object представляє відкритий файл. Для створення файлових об’єктів доступні різні ярлики: вбудована функція open(), а також os.popen(), os.fdopen() і makefile() метод об’єктів сокета (і, можливо, за допомогою інших функцій або методів, наданих модулями розширення).
Об’єкти sys.stdin, sys.stdout і sys.stderr ініціалізуються об’єктами файлів, що відповідають стандартним потокам введення, виведення та помилок інтерпретатора; усі вони відкриті в текстовому режимі, тому відповідають інтерфейсу, визначеному io.TextIOBase абстрактним класом.
Внутрішні типи
Кілька типів, які використовуються внутрішньо інтерпретатором, доступні користувачеві. Їх визначення можуть змінюватися в майбутніх версіях інтерпретатора, але вони згадуються тут для повноти.
Об’єкти коду
Об’єкти коду представляють байт-скомпільований виконуваний код Python або bytecode. Різниця між об’єктом коду та об’єктом функції полягає в тому, що об’єкт функції містить явне посилання на глобальні елементи функції (модуль, у якому вона була визначена), тоді як об’єкт коду не містить контексту; також значення аргументів за замовчуванням зберігаються в об’єкті функції, а не в об’єкті коду (оскільки вони представляють значення, обчислені під час виконання). На відміну від функціональних об’єктів, об’єкти коду є незмінними і не містять посилань (прямих чи опосередкованих) на змінні об’єкти.
Special read-only attributes: co_name gives the function name; co_qualname gives the fully qualified function name; co_argcount is the total number of positional arguments (including positional-only arguments and arguments with default values); co_posonlyargcount is the number of positional-only arguments (including arguments with default values); co_kwonlyargcount is the number of keyword-only arguments (including arguments with default values); co_nlocals is the number of local variables used by the function (including arguments); co_varnames is a tuple containing the names of the local variables (starting with the argument names); co_cellvars is a tuple containing the names of local variables that are referenced by nested functions; co_freevars is a tuple containing the names of free variables; co_code is a string representing the sequence of bytecode instructions; co_consts is a tuple containing the literals used by the bytecode; co_names is a tuple containing the names used by the bytecode; co_filename is the filename from which the code was compiled; co_firstlineno is the first line number of the function; co_lnotab is a string encoding the mapping from bytecode offsets to line numbers (for details see the source code of the interpreter); co_stacksize is the required stack size; co_flags is an integer encoding a number of flags for the interpreter.
Для co_flags визначено такі біти прапорів: біт 0x04 встановлюється, якщо функція використовує синтаксис *arguments для прийняття довільної кількості позиційних аргументів; біт 0x08 встановлено, якщо функція використовує синтаксис **keywords для прийняття довільних ключових аргументів; біт 0x20 встановлено, якщо функція є генератором.
Оголошення майбутніх функцій (from __future__ import division) також використовують біти в co_flags, щоб вказати, чи був об’єкт коду скомпільовано з певною функцією: біт 0x2000 встановлюється, якщо функція була скомпільована з увімкненим майбутнім поділом; біти 0x10 і 0x1000 використовувалися в попередніх версіях Python.
Інші біти в co_flags зарезервовані для внутрішнього використання.
Якщо об’єкт коду представляє функцію, перший елемент у co_conts — це рядок документації функції або None, якщо не визначено.
codeobject.co_positions()
Returns an iterable over the source code positions of each bytecode instruction in the code object.
The iterator returns tuples containing the (start_line, end_line, start_column, end_column). The i-th tuple corresponds to the position of the source code that compiled to the i-th instruction. Column information is 0-indexed utf-8 byte offsets on the given source line.
This positional information can be missing. A non-exhaustive lists of cases where this may happen:
Running the interpreter with -X no_debug_ranges.
Loading a pyc file compiled while using -X no_debug_ranges.
Position tuples corresponding to artificial instructions.
Line and column numbers that can’t be represented due to implementation specific limitations.
When this occurs, some or all of the tuple elements can be None.
Нове в версії 3.11.
Примітка
This feature requires storing column positions in code objects which may result in a small increase of disk usage of compiled Python files or interpreter memory usage. To avoid storing the extra information and/or deactivate printing the extra traceback information, the -X no_debug_ranges command line flag or the PYTHONNODEBUGRANGES environment variable can be used.
Рамкові об’єкти
Об’єкти фрейму представляють кадри виконання. Вони можуть виникнути в об’єктах трасування (див. нижче), а також передаються зареєстрованим функціям трасування.
Спеціальні атрибути лише для читання: f_back до попереднього фрейму стека (до абонента), або None, якщо це нижній фрейм стека; f_code - об’єкт коду, який виконується в цьому кадрі; f_locals - це словник, який використовується для пошуку локальних змінних; f_globals використовується для глобальних змінних; f_builtins використовується для вбудованих (внутрішніх) імен; f_lasti дає точну інструкцію (це індекс у рядку байт-коду об’єкта коду).
Доступ до f_code викликає подію аудиту object.__getattr__ з аргументами obj і "f_code".
Спеціальні атрибути, доступні для запису: f_trace, якщо не None, це функція, яка викликається для різних подій під час виконання коду (вона використовується налагоджувачем). Зазвичай подія запускається для кожного нового вихідного рядка - це можна вимкнути, встановивши f_trace_lines на False.
Реалізації можуть дозволити надсилати запит на події кожного коду операції, встановивши для f_trace_opcodes значення True. Зауважте, що це може призвести до невизначеної поведінки інтерпретатора, якщо винятки, викликані функцією трасування, переходять до функції, що трасується.
f_lineno — поточний номер рядка кадру — запис у нього з функції трасування переходить до заданого рядка (лише для самого нижнього кадру). Налагоджувач може реалізувати команду Jump (така ж Set Next Statement), записавши f_lineno.
Об’єкти фрейму підтримують один метод:
frame.clear()
Цей метод очищає всі посилання на локальні змінні, які містяться у кадрі. Крім того, якщо кадр належав генератору, генератор завершується. Це допомагає розірвати цикли посилань, пов’язані з об’єктами фрейму (наприклад, під час перехоплення винятку та збереження його трасування для подальшого використання).
RuntimeError виникає, якщо кадр зараз виконується.
Нове в версії 3.4.
Об’єкти відстеження
Об’єкти Traceback представляють трасування стека виняткової ситуації. Об’єкт трасування неявно створюється, коли виникає виняткова ситуація, а також може бути явно створений викликом types.TracebackType.
Для неявно створених трасування, коли пошук обробника винятків розгортає стек виконання, на кожному розкрученому рівні об’єкт трасування вставляється перед поточним трасуванням. Коли вводиться обробник винятків, трасування стека стає доступним для програми. (Див. розділ Оператор try.) Він доступний як третій елемент кортежу, який повертає sys.exc_info(), і як атрибут __traceback__ перехопленого винятку.
Якщо програма не містить відповідного обробника, трасування стека записується (добре відформатована) у стандартний потік помилок; якщо інтерпретатор є інтерактивним, він також стає доступним для користувача як sys.last_traceback.
Для явно створених зворотних трасувань автор повинен визначити, як атрибути tb_next повинні бути пов’язані, щоб сформувати повну трасування стека.
Спеціальні атрибути лише для читання: tb_frame вказує на кадр виконання поточного рівня; tb_lineno вказує номер рядка, де сталася виняток; tb_lasti вказує на точну інструкцію. Номер рядка та остання інструкція в трасуванні можуть відрізнятися від номера рядка його об’єкта фрейму, якщо виняток стався в операторі try без відповідного пункту крім або з пунктом finally.
Доступ до tb_frame викликає подію аудиту object.__getattr__ з аргументами obj і "tb_frame".
Спеціальний атрибут, доступний для запису: tb_next — це наступний рівень трасування стека (до кадру, де сталася виняток), або None, якщо наступного рівня немає.
Змінено в версії 3.7: Об’єкти відстеження тепер можна явно створювати з коду Python, а атрибут tb_next існуючих екземплярів можна оновлювати.
Розрізати об’єкти
Об’єкти фрагментів використовуються для представлення фрагментів для методів __getitem__(). Вони також створюються за допомогою вбудованої функції slice().
Спеціальні атрибути лише для читання: start нижня межа; stop є верхньою межею; step — значення кроку; якщо опущено, кожен має значення None. Ці атрибути можуть мати будь-який тип.
Об’єкти Slice підтримують один метод:
slice.indices(self, length)
Цей метод приймає єдиний цілочисельний аргумент length і обчислює інформацію про зріз, який описав би об’єкт slice, якщо його застосувати до послідовності елементів length. Він повертає кортеж із трьох цілих чисел; відповідно, це індекси start і stop і крок або довжина кроку зрізу. Відсутні індекси або індекси, що виходять за межі, обробляються відповідно до звичайних фрагментів.
Об’єкти статичних методів
Об’єкти статичних методів забезпечують спосіб відмови від перетворення об’єктів функції в об’єкти методів, описані вище. Статичний об’єкт методу є обгорткою навколо будь-якого іншого об’єкта, зазвичай об’єкта методу, визначеного користувачем. Коли об’єкт статичного методу отримується з класу або екземпляра класу, фактично повернутий об’єкт є об’єктом-огорткою, який не підлягає подальшому перетворенню. Об’єкти статичних методів також можна викликати. Об’єкти статичних методів створюються за допомогою вбудованого конструктора staticmethod().
Об’єкти методу класу
Об’єкт методу класу, як і статичний об’єкт методу, є оболонкою навколо іншого об’єкта, яка змінює спосіб, у який цей об’єкт отримується з класів та екземплярів класу. Поведінка об’єктів методу класу після такого отримання описана вище, у розділі «Визначені користувачем методи». Об’єкти методу класу створюються за допомогою вбудованого конструктора classmethod().