@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Python: with 構文

reiki4040.hatenablog.com

要は 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 を使うと良さそう、というのは以下の記事経由で知った。

y0m0r.hateblo.jp