I wanted to ask this here because what I wanted to originally do felt like a really Pythonic method. I want to be able to use the syntax:
d = {'apple':{'cranberry':{'banana':{'chocolate':[1,2,3,4,5,6]}}},'b':2}
with d['apple']['cranberry']['banana']['chocolate'] as item:
for i in item:
print(i)
item.append('k')
but found that Python doesn't allow for using lists, dicts, etc. as context managers.
So I implemented my own:
def context_wrap(target):
class ContextWrap:
def __init__(self, tgt):
self._tgt = tgt
def __enter__(self):
return self._tgt
def __exit__(self, type, value, traceback):
pass
return ContextWrap(target)
if __name__ == '__main__':
with context_wrap({'a':1}) as item:
print(item['a'])
with context_wrap([1,2,3,4,5]) as item:
print(item[1])
with context_wrap(3) as item:
print (item)
In the above code, you can take any random object and wrap it inside an object that acts as a context manager controlling the underlying object. This means that inside any with
clause, you can simply use the object with its alias. I feel like it looks a lot cleaner and clearer than something like:
alias = d['apple']['cranberry']['banana']['chocolate']
for i in alias:
print(i)
alias.append('k')
I wanted to know if there was a more "Pythonic" way to do it. So the improvement that I'm looking for is in terms of better reliance on the standard Python library and/or in terms of my syntax.
item = d['a']
? Usually the purpose of a context manager is to do something in the__exit__
(close a file, free a resource, etc) but your use case doesn't require anything like that. \$\endgroup\$Context Manager Wrapper
and there was a paragraph explaining what the code does. \$\endgroup\$d = {'a':{'b':{'c':{'d':'e'}}}}
where the object is complex/deeply nested. \$\endgroup\$