Context without manager

Piergiorgio Sartor piergiorgio.sartor.this.should.not.be.used at nexgo.REMOVETHIS.de
Sun Nov 26 13:58:58 EST 2023


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



More information about the Python-list mailing list