Parameters in context manager's __enter__ method?

Matimus mccredie at gmail.com
Wed Oct 24 17:40:24 EDT 2007


On Oct 24, 7:06 am, s... at pobox.com wrote:
> I am working on a file locking class which I'd like to work with Python
> 2.5's context managers.  The acquire method takes an optional timeout
> argument:
>
>     class FileLock:
>         ...
>         def acquire(self, timeout=None):
>             ...
>
>         def __enter__(self):
>             self.acquire()
>             return self
>
> Can that optional timeout be somehow accommodated by the with statement?
> (I'm thinking no, which may not be a big shortcoming anyway.)
>
> Thx,
>
> Skip

I think a better solution might be to create a locking class, and a
seperate context manager class. That way you can pass the timeout as a
parameter to the context managers constructor:

[code]
fl = FileLock(...)
with FileLockContext(filelock=fl, timeout=1000):
   # do stuff
[/code]

But another option along the same line might be to have the acquire
method return the context instance. Then you could write:

[code]
class FileLockContext(fl, timeout):
    ...

class FileLock:
    ...
    def acquire(self, timeout=None):
        # do acquiring
        return FileLockContext(self, timeout)

fl = FileLock(...)
with fl.acquire(1000):
  #do stuff
[/code]

Or, you could go the same path you are already, using a hybrid, and
pass timeout to the FileLock constructor.

Matt




More information about the Python-list mailing list