【Python】Pythonコードにでてくるアンダースコアの意味は?
以下の記事でdjangoチュートリアルをやりながら、初めてまともにPythonコードを読んでみて気になったことがありました。
コードの中にアンダースコアで囲まれた変数があったりしました。
これまでjavaやPHPをやってきて、このような書き方をみたことがなかったので、どのようなものか調べました。
Pythonではアンダースコアで変数を囲う?
djangoの管理コマンドユーティリティファイルである「manege.py」に以下のようなコードがありました。
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "trade_server.settings")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
nameをアンダースコアで囲っていますね。
これにどのような意味があるのか調べてみました。
アンダースコアの意味は?
上記は半角のアンダースコア(_)2つずつを前後囲ったものですが、それだけではないです。
アンダースコア1個で囲ったものもあります。他にも前にだけアンダースコアがついたものや後ろにだけついたものもあります。
それぞれ、以下のような役割があるみたいです。
・アンダースコア2個で囲う(”__hogehoge__”)
→Python上でコアな役割をもった変数やメソッドへ付与する。個人開発レベルでは使うことはない模様。
・アンダースコア1個で囲う(”_hogehoge_”)
→このような書き方はしない。
・アンダースコア2個前につける(”__hogehoge”)
→外部参照をしない変数やメソッドとするために付けている。アンダースコア2つをつけることで「マンダリング」が行われ、Javaでいうprivate修飾子のような役割ができるようです。(マンダリングがどのようなものかは理解できていないです…)
継承の時に問題が起こることがあるらしい。(その場合はアンダースコア1個を使うみたいです。)
・アンダースコア1個前につける(”_hogehoge”)
→極力外部から参照しないものを明記したものらしいです。実際には外部から参照することも可能なようです。
・アンダースコア1個後ろにつける(”hogehoge_”)
→他の変数との衝突を避けるためにつけるようです。
まとめ
Pythonではアンダースコアによって、変数やメソッドのスコープを決めているようですね。
これ以外にも気になったことがあれば、備忘録としてまとめたいと思います。
参考資料

ディスカッション
コメント一覧
まだ、コメントがありません