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