【Python】Pythonコードにでてくるアンダースコアの意味は?

2019年1月27日

以下の記事でdjangoチュートリアルをやりながら、初めてまともにPythonコードを読んでみて気になったことがありました。

【Python】djangoのチュートリアルをやってみる<その1>

コードの中にアンダースコアで囲まれた変数があったりしました。

これまで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ではアンダースコアによって、変数やメソッドのスコープを決めているようですね。

これ以外にも気になったことがあれば、備忘録としてまとめたいと思います。

 

参考資料