Table of Contents
Summary
Home Backend Development Python Tutorial Demystifying the with keyword in Python

Demystifying the with keyword in Python

Apr 14, 2023 am 11:31 AM
python code with

Demystifying the with keyword in Python

Many of us have seen this code snippet over and over again in Python code:

with open('Hi.text', 'w') as f:
f.write("Hello, there")
Copy after login

However, some of us don’t know what with and why we need to use it here. In this read, you'll find out about almost any problem that can be solved with. let's start!

First, let’s think about what we need to do without using the with keyword. In this case we need to open the file first and try to write. Regardless of success or failure, we'd better close it at the end, so our code will look like this:

f = open('Hi.text', 'w')
try:
f.write('Hello, there')
finally:
f.close()
Copy after login

So, what is the use of the with keyword? It just helps shorten our try..finally code to a single with... statement! This is how the with statement is used.

So, what exactly is it? In fact, the with statement itself is nothing special in Python, it is just a feature of the context manager in Python. A context manager, quoted from the official Python documentation, is a way to allow you to allocate and free resources exactly when needed, or simply put: shorten your code snippet when you do something on some resource, which means Then you can define the usage of the with statement yourself!

How do we do this? Well, it's simple, you just need to implement two magic functions: one called __enter__ and the other called __exit__. The first way is to write a class that implements these two functions as shown below:

class My_file:
def __init__(self, fname):
self.fname = fname
def __enter__(self):
self.file = open(self.fname, 'w')
return self.file
def __exit__(self, exc_type, exc_val, exc_trace_back):
if self.file:
self.file.close()
Copy after login

Here, we have created a normal Python class that implements the two magic functions. Note the signatures of these two functions: __enter__ will only accept self , while __exit__ will accept more arguments, the three in the example are the standard form. In this way, we can use it directly:

with My_file('hello.txt') as f:
f.write('hello, world!')
Copy after login

The with statement here will first call __init__ to construct a new object, and then call the __enter__ method; finally, it will trigger the __exit__ method before the code block is completed. So, the rough equivalent of the above code is as follows:

myfile = My_file('hello.txt')
f = myfile.__enter__()
f.write('hello, world!')
myfile.__exit(...)
Copy after login

The second way to implement a context manager is through a decorator, as follows:

  1. You import contextmanager from contextlib
  2. You write a function to implement the with statement you want.
  3. Add a decorator @contextmanager above the function.
  4. Use your with your_function!

According to the above introduction, let us write a decorator context manager!

from contextlib import contextmanager
@contextmanager
def my_file_open(fname):
try:
f = open(fname, 'w')
yield f
finally:
print('Closing file')
f.close()
with file_open('hi.txt') as f:
f.write('hello world')
Copy after login

The above pretty much covers all the basics of with statements and context managers, but if you want to learn more, keep going...!

There are some handy tools in contextlib for you to use. The first one is closing . closing basically wraps your block of code with another function that you implement before exiting.

@contextmanager
def closing(f):
try:
f.write("Finish writing")
finally:
f.close()
with closing(open("hi.text")):
f.write("hello world")
Copy after login

For example, in the above code, we can directly call close(your_way_of_getting_resource), and before the code block you write below is about to complete (f.write("hello world")), it will execute try ..finally block we defined above.

The other is to use the suppress tool. We know that in many cases, if we try to get some resources, it is likely that errors such as FileNotFoundException will occur when opening the file. In some cases we want to catch errors or suppress them so that the program can continue to run normally. suppress is one way we can suppress warnings. All you need to do is figure out which exception you want to suppress and write with suppress(your_choice_of_exception) and Python will handle it from there.

In other cases, you may only want to perform certain actions when entering a with block. In this case, nullcontext will be convenient for you. nullcontext will just return what you defined in the __enter__ function and won't do anything else. If you are dealing with async operations in Python to access resources, aclosure is a utility for handling this situation.

Summary

This article introduces some basic concepts and usage of the with statement and its underlying working principle. There's lots more interesting stuff, check out Python's contextlib documentation. Finally, I wish you the same happy learning and happy coding as always!

The above is the detailed content of Demystifying the with keyword in Python. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

HadiDB: A lightweight, horizontally scalable database in Python HadiDB: A lightweight, horizontally scalable database in Python Apr 08, 2025 pm 06:12 PM

HadiDB: A lightweight, high-level scalable Python database HadiDB (hadidb) is a lightweight database written in Python, with a high level of scalability. Install HadiDB using pip installation: pipinstallhadidb User Management Create user: createuser() method to create a new user. The authentication() method authenticates the user's identity. fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Python: Exploring Its Primary Applications Python: Exploring Its Primary Applications Apr 10, 2025 am 09:41 AM

Python is widely used in the fields of web development, data science, machine learning, automation and scripting. 1) In web development, Django and Flask frameworks simplify the development process. 2) In the fields of data science and machine learning, NumPy, Pandas, Scikit-learn and TensorFlow libraries provide strong support. 3) In terms of automation and scripting, Python is suitable for tasks such as automated testing and system management.

The 2-Hour Python Plan: A Realistic Approach The 2-Hour Python Plan: A Realistic Approach Apr 11, 2025 am 12:04 AM

You can learn basic programming concepts and skills of Python within 2 hours. 1. Learn variables and data types, 2. Master control flow (conditional statements and loops), 3. Understand the definition and use of functions, 4. Quickly get started with Python programming through simple examples and code snippets.

Navicat's method to view MongoDB database password Navicat's method to view MongoDB database password Apr 08, 2025 pm 09:39 PM

It is impossible to view MongoDB password directly through Navicat because it is stored as hash values. How to retrieve lost passwords: 1. Reset passwords; 2. Check configuration files (may contain hash values); 3. Check codes (may hardcode passwords).

How to use AWS Glue crawler with Amazon Athena How to use AWS Glue crawler with Amazon Athena Apr 09, 2025 pm 03:09 PM

As a data professional, you need to process large amounts of data from various sources. This can pose challenges to data management and analysis. Fortunately, two AWS services can help: AWS Glue and Amazon Athena.

How to optimize MySQL performance for high-load applications? How to optimize MySQL performance for high-load applications? Apr 08, 2025 pm 06:03 PM

MySQL database performance optimization guide In resource-intensive applications, MySQL database plays a crucial role and is responsible for managing massive transactions. However, as the scale of application expands, database performance bottlenecks often become a constraint. This article will explore a series of effective MySQL performance optimization strategies to ensure that your application remains efficient and responsive under high loads. We will combine actual cases to explain in-depth key technologies such as indexing, query optimization, database design and caching. 1. Database architecture design and optimized database architecture is the cornerstone of MySQL performance optimization. Here are some core principles: Selecting the right data type and selecting the smallest data type that meets the needs can not only save storage space, but also improve data processing speed.

How to start the server with redis How to start the server with redis Apr 10, 2025 pm 08:12 PM

The steps to start a Redis server include: Install Redis according to the operating system. Start the Redis service via redis-server (Linux/macOS) or redis-server.exe (Windows). Use the redis-cli ping (Linux/macOS) or redis-cli.exe ping (Windows) command to check the service status. Use a Redis client, such as redis-cli, Python, or Node.js, to access the server.

How to read redis queue How to read redis queue Apr 10, 2025 pm 10:12 PM

To read a queue from Redis, you need to get the queue name, read the elements using the LPOP command, and process the empty queue. The specific steps are as follows: Get the queue name: name it with the prefix of "queue:" such as "queue:my-queue". Use the LPOP command: Eject the element from the head of the queue and return its value, such as LPOP queue:my-queue. Processing empty queues: If the queue is empty, LPOP returns nil, and you can check whether the queue exists before reading the element.

See all articles