いろは3010814 views
高校化学2924392 views
教育149510 views
雑学1473612 views
ヒストリア290598 views
LaTeX962153 views
高校日本史190571 views
MathPython497343 views
中学理科1630641 views
中学社会668760 views
Help
Tools
NewsSpreadsheetCalendarSlidesTier ListPen ToolIllustrationCrayonPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchSwirl EffectOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsCross SectionsMotion PathMechanicsWavesElectromagnetic WavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHPeriodic TableComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseMuscle ContractionRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic TheoryShogi StrategyPiano Rhythm Game

English

Python の with 文とは

with 文は、リソースの確保と解放を自動的に行うための構文です。ファイルやネットワーク接続など、使い終わったら必ず後始末が必要なリソースを安全に扱えます。

with 文の基本

最もよく使われるのは、ファイル操作です。

with open("data.txt", "r") as f:
    content = f.read()
    print(content)
# ブロックを抜けると自動的にファイルが閉じられる

with ブロックを抜けると、正常終了でも例外発生でも、必ずファイルが閉じられます。

with 文を使わない場合

with を使わないと、自分で close() を呼ぶ必要があります。

f = open("data.txt", "r")
try:
    content = f.read()
    print(content)
finally:
    f.close()

try-finally を毎回書くのは面倒ですし、書き忘れるとリソースリークの原因になります。with 文を使えば、こうした問題を防げます。

なぜ with 文が必要か

with 文なし

close() の呼び忘れリスクがある。例外発生時の処理が複雑になる。コードが冗長になる。

with 文あり

自動的にリソースが解放される。例外が発生しても安全。コードが簡潔になる。

with 文の動作

with 文は内部で以下の処理を行っています。

enter() を呼び出す

ブロック内のコードを実行

exit() を呼び出す(例外の有無に関わらず)

__enter__()__exit__() を持つオブジェクトを「コンテキストマネージャ」と呼びます。

as 句の省略

リソースを変数に束縛する必要がなければ、as は省略できます。

from threading import Lock

lock = Lock()

with lock:  # as を省略
    # ロックを保持した状態で処理
    print("クリティカルセクション")

標準ライブラリのコンテキストマネージャ

Python の標準ライブラリには、多くのコンテキストマネージャが用意されています。

# ファイル操作
with open("file.txt") as f:
    pass

# スレッドロック
from threading import Lock
with Lock():
    pass

# 一時ディレクトリ
from tempfile import TemporaryDirectory
with TemporaryDirectory() as tmpdir:
    print(tmpdir)

# データベース接続(sqlite3)
import sqlite3
with sqlite3.connect("test.db") as conn:
    pass

with 文を積極的に使うことで、リソース管理のバグを減らし、コードの可読性を高められます。