LINUX.ORG.RU

Не пойму терминологию в Python. Менеджеры контекста

 


1

1

Юзал инструкцию with для работы с файлами, но целостной картины представления не получил. функцию open называют где как - менеджер контекста или диспетчер контекста. Что здесь означает слово «контекст»?

Из книги HeadFirst O Reilly Инструкция with управляет контекстом, в котором выполняется ее блок.


Эмм, да просто читай по-английски:

с открытым файлом таким-то:
    сделать то-то

Контекст здесь: «с открытым файлом таким-то», он создаётся перед «сделать то-то» и уничтожается после

Deleted
()

Под контекстом в данном случае понимается всё, что происходит между вызовами __enter__ и __exit__ этого менеджера контекста. А сами эти методы, соответственно, описывают действия, которые выполнятся при входе в этот контекст и выходе из него.

beresk_let ★★★★★
()

Не пойму терминологию в Python

Не удивительно, у них же свой python way птичий язык.

Что здесь означает слово «контекст»?

Оно означает ресурс.

менеджер контекста

А это контекст ресурса, т.е. объект, который инкапсулирует ресурс.

with <ресурс> as <контекст ресурса>:
   <тут доступен контекст ресурса>
no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от beresk_let

Контекст — это не действие, а состояние. Это скорее то, что возвращает тебе __enter__, либо то, что изменяет по капотом при входе в блок with. Возвращать-то он может всё, что угодо.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от beresk_let

Под контекстом в данном случае понимается всё, что происходит между вызовами enter и exit этого менеджера контекста.

При этом используются нативные инструкции процессора ENTER and LEAVE? Или эмуляция какая-то своя?

BruteForceSSL
()

Это то что умеет работать с конструкцией with. Ты можешь свой такой сделать. Например для файла нужно чтобы по выходу из блока with файл закрылся. Или транзакция бд может быть в таком блоке.

pawnhearts ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Да, согласен, вернее будет сказать — состояние между вызовами __enter__ и __exit__.

beresk_let ★★★★★
()
Ответ на: комментарий от no-such-file

Оно означает ресурс. а это контекст ресурса, т.е. объект, который инкапсулирует ресурс.

В Transact-SQL (MS SQL) WITH - это временное имя (тут у вас это контекст ресурса) для датасета (ресурса):

«Specifies a temporary named result set, known as a common table expression (CTE).»

Вероятно, топикстартер впал в ступор, увидев такую кривую терминологию, как «контекст». На машинном уровне в защищённом режиме этот термин имеет совсем иной смысл.

BruteForceSSL
()

в бидоне называют простые очевидные вещи своими кривыми именами.

Файл это ресурс. Контекст - область внутри with. В терминологии .Net, например, with это using, в терминологии C++, это все вместе называется RAII, в терминологии Java - try with resources.

lovesan ★★
()
Ответ на: комментарий от BruteForceSSL

это временное имя (тут у вас это контекст ресурса) для датасета (ресурса):

Это не то чтобы временное имя, а сущность, через которую можно обращаться к ресурсу. Ресурс это общее понятие, которое в языке не выражается напрямую (файл, сервис, api), а контекст ресурса — это уже конкретная языковая сущность, представляющая ресурс (например, дескриптор, структура, объект). Хотя бывает так, что контекст предоставляется неявно, внутри некоторой области видимости. Т.е. тогда какие-то операции будут работать внутри этой области с определённым (но указываемым каждый раз явно) контекстом.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от lovesan

Как я понял

with как видит менеджер контекста(в случае с файлами, менеджер контекста - open) создает контекст(в него входят: основной блок кода, код инициализации и код завершения). Далее with управляет контекстом выполняя методы менеджера контекста.

with open('text.txt') as file:
 что-то делаю

Если не верно написал, можете написать определения этим трем терминам: контекст, менеджер контекста, with

KRex
() автор топика
Ответ на: Как я понял от KRex

Менеджер контекста это то же самое что ресурс, считай.

Файл(точнее, питоновская обертка над ним), это ресурс, он же «менеджер контекста».

open это просто функция которая возвращает ресурс(возвращает «менеджер контекса»). ты вместо open(…) там с таким же успехом можешь просто имя переменной, содержащей ссылку на ресурс, написать.

У ресурса есть соответственно, метод инициализации и метод закрытия, вот эти вот enter и exit; первый в случае файлов не используется(да и вообще его почти никто не использует), потому что а нафига, если уже все сделано в open. И да, with их вызывает как ты написал.

lovesan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.