In a nutshell
Pythonでは """
はコメントではなく文字列リテラルとして扱われるため,バックスラッシュ\
などが含まれると構文エラーになることがある.一番簡単で安全な回避策は,r"""
を使うこと.確実にコメントとして無視させたいなら,#
を使うべき.
はじめに
Python で,コメントアウトが原因でエラーが発生した.普段は C++ を利用しており,コメントアウト関係でエラーが発生する事を想定していなかった為に驚いた.かなり基本的な事のようだったが,良い機会なので,調べた事を以下に纏めた.
発生したエラー
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 70-71: truncated \UXXXXXXXX escape
原因と対処方法
原因
これは,Python が """
(三重クォート)内の文字列を Unicode エスケープシーケンスとして解釈しようとした時に発生するエラーである.具体的には,"""
の中に,\
(バックスラッシュ) が含まれていた事が原因.
"""
単なる文字を含める.
"""
# これは,当然エラーとはならない.
"""
今回のケースでは,パス情報を,複数行のコメントアウトに含めていた.
C:user\aaa\bbb
"""
# エラー発生
エラーが生じる原理
"""
内に記述された内容は文字列リテラルとして解釈されるため,Python では \
は特別なエスケープシーケンスとして扱われる.したがって,\
は Unicodeエスケープシーケンスとして解釈されようとする為に正しいフォーマットでないとエラーとなる.特に Windowsのパスなどは注意が必要."""
の文字列がどこにも代入されなければ実行時に無視される為に擬似コメントとして用いる事ができるが,それは仕様に依存した偶然であり安全ではない.
対処方法
r"""
を使う
r"""
とするとエスケープシーケンスを無効化できる.
r"""
(base) C:\Users\user>Python --version
Python 3.13.2
"""
# r"""を用いる事でエラーは発生しない
\
を \\
に置き換える
\
を \\
にすると,Python のエスケープシーケンスの誤解釈を回避する事ができる.
"""
(base) C:\\Users\\user>Python --version
Python 3.13.2
"""
# \\を用いる事でエラーは発生しない
複数行のコメントアウトでも #
を利用する
Python の """
は厳密にはコメントアウトではなく,文字列リテラルである.
正式なコメントアウトとして #
を使う事も検討すべき.
数行程度であれば,手間では無い.
# (base) C:\Users\user>Python --version
# Python 3.13.2
# #を用いているためエラーは発生しない
補足:文字列リテラルとは
"""
は複数行に適用できる利点があるが,文法的にはコードの一部である(文字列リテラル).したがって,評価対象となる.対して #
はコメントであり,以降の行末までが完全に無視される.文字列内に特殊文字があると上記に記述した通りエラーが生じる.対して #
は文法的に無害であり,何が書いてあっても構文エラーとはならない.したがって """
は厳密にはコメントではない.確実に無視させたい場合は #
を用いるのが安全.
補足:docstring との違い
"""
は関数やクラスの説明に使われる「ドキュメンテーション文字列(docstring)」としても利用される.これは実行時に __doc__
属性として参照可能となる.一方,本文で説明したような """
による「擬似的なコメントアウト」は,構文上は単なる未使用の文字列リテラルであり,安全性が保証されないため注意が必要である.
Summary
- そのままの形式で記録する ->
r"""
を使う - Pythonの解釈に合わせる ->
\
を\\
に置き換える - 数行程度の単なるメモでコードと無関係 ->
#
を使う