Mailing List Archive

Context without manager
?Read the Fine context manager documentation.
What “with with_expression as var” does is effectively:

ob = with_expression
var = ob.__enter__()

And then at the end of the with, does a
ob.__exit__()

(With some parameters to __exit__, that could just be None, None, None for the simplest case).

Note, YOUR program must now make sure that the __exit__ function is called, and handle any exceptions that got thrown, and that ob and var are put somewhere you can access them at that later time.


> On Nov 27, 2023, at 12:24?PM, Piergiorgio Sartor via Python-list <python-list@python.org> wrote:
>
> ?On 26/11/2023 18.50, Dieter Maurer wrote:
>> Piergiorgio Sartor wrote at 2023-11-25 22:15 +0100:
>>> ...
>>> Apparently, the "with" context manager is not usable
>>> in classes, at least not with __init__() & co.
>> You can use `with` in classes -- with any context manager.
>> However, you would usually not use `with` with a file you have opened
>> in `__init__`.
>> If a class defines `__enter__` and `__exit__` (i.e.
>> the "cntext manager protocol"), then its instances
>> can be used with the `with` statement.
>> The important use case for a context manager is the
>> situation:
>> set up a context (--> method `__enter__`)
>> perform some operations in this context (--> body of `with` statement)
>> tear down the context (--> method `__exit__`).
>> If you do not have this case (e.g. usually if you open the file
>> in a class's `__init__`), you do not use a context manager.
>
> Very clear, but what if the class is *not* "open()",
> but something else _requiring_ using "with"?
> How to do this in a "__init__()" of a class?
>
> In other words, what if "open()" could *only* be used
> with "with" and not just by assigning "fp = open()"?
>
> The problem is I've some SDK of some device which
> provides context manager *only* classes.
>
> I *cannot* do:
>
> device = device_open(...)
> device.do_something()
> device.close()
>
> I *must* do:
>
> with device_open() as device:
> device.do_something()
>
> Nevertheless, I _need_ to have a class
> where the device is opened in the __init__()
> and used in some methods.
>
> Any ideas?
>
> bye,
>
> --
>
> piergiorgio
>
> --
> https://mail.python.org/mailman/listinfo/python-list

--
https://mail.python.org/mailman/listinfo/python-list