You can also use the @contextmanager decorator: from contextlib import contextmanager class File: def __init__(self, path: str, mode: str): self.path = path self.mode = mode self.is_open = True def do_something(self): if self.is_open: print(f"Hi! This is a file. Its path is '{self.path}' and its mode is '{self.mode}'") return raise ValueError("this file is closed") def close(self): self.is_open = False @contextmanager def open_file(path: str, mode: str = "r"): file = File(path, mode) yield file file.close() with open_file(r"myfile.txt") as f: f.do_something()
In a most cases it is easier to achieve with contextmanager decorator from contextlib: @contextmanager def open(name: str): print(f'opening file: {name!r}') yield 'return value' print(f('closing file: {name!r}') # exit block
2:04 how did you get that entire line of text to appear automatically? "def __exit__(self, exc_type, exc_val, exc_tb):" Is it possible to do this in VS Code?
Really useful stuff. Thank you! I immediately implemented it in my database class.
You can also use the @contextmanager decorator:
from contextlib import contextmanager
class File:
def __init__(self, path: str, mode: str):
self.path = path
self.mode = mode
self.is_open = True
def do_something(self):
if self.is_open:
print(f"Hi! This is a file. Its path is '{self.path}' and its mode is '{self.mode}'")
return
raise ValueError("this file is closed")
def close(self):
self.is_open = False
@contextmanager
def open_file(path: str, mode: str = "r"):
file = File(path, mode)
yield file
file.close()
with open_file(r"myfile.txt") as f:
f.do_something()
I think it is a perfect feature. It may be useful for opening a video in OpenCV. Because I generally forget to close the video stream.
That‘s another way of wrapping
Thanks, i have been thinking about writing my own context manager, but don't have the time to check the docs.
Thanks.
In a most cases it is easier to achieve with contextmanager decorator from contextlib:
@contextmanager
def open(name: str):
print(f'opening file: {name!r}')
yield 'return value'
print(f('closing file: {name!r}') # exit block
Thank you so much for this informative stuff.
Greatly explained.
python programmer can't find curly brackets 😂
i wish we used curlies instead of indentation icl ;_;
You are the man!!
A good explanation, thank you
What gets called if you just fall out of the with block without an exception? Is there a "__else__" to make it consistent with loops? 😆
Any chance of an extra one on this showing operation of "async with"?
How do you implement __ENTER__ and __EXIT__ at the method level not class level?
❓
As a static class method? You don't.
Thanks for the explanation! However, 'open' is a function rather than a class, so how does that work actually behins the scenes?
Obviously it returns an object that has the enter and exit Dunder methods. Probably a FILE object...
Thank you so much for explaining context managers in Python 👍!
likes = 63 😉😉
2:04 how did you get that entire line of text to appear automatically? "def __exit__(self, exc_type, exc_val, exc_tb):"
Is it possible to do this in VS Code?
for me the same, does not show __enter__ and __exit__
he's using an IDE.looks like Intellij Idea, maybe? not sure
Which app are you using
I guess you mean the IDE he is using? It's PyCharm.
What font do you use?
I think it's called Jetbrains Mono
What's the code editor name?
PyCharm
Is there a discord channel