要は Ruby のブロックと同じようなもの、という理解で良さそう。
Python
with open('/etc/passwd') as f: print(f.read())
Ruby
open('/etc/passwd') do |f| puts f.read end
open
以外の例としては unittest の assertRaises
がある。
unittest --- ユニットテストフレームワーク — Python 3.9.1rc1 ドキュメント
import unittest class TestFoo(unittest.TestCase): def test_foo(self): with self.assertRaises(ZeroDivisionError): 1/0 if __name__ == '__main__': unittest.main()
assertRaises に渡す callable として即席の関数を定義したり lambda を渡したりするよりも見通しがよくなる。
なお、 assertRaises で with を使うと良さそう、というのは以下の記事経由で知った。