質問: ### 前提・実現したいこと お世話になります。 現在pythonを勉強中です。 変数や関数の頭か後ろにアンダーバーがついているのをよく見かけるのですが、そのうち、後ろについている場合の意味が理解できていません。 頭についている場合は、参照に制限をかけていることはすぐに調べられたのですが、後ろについている場合を説明しているサイトや参考書が見当たりませんでした。 例:*__name__*や*__init__*など ご理解されている方がいらっしゃましたら、ご教示のほどお願い申し上げます。 ### 発生している問題・エラーメッセージ ``` エラーメッセージ ``` ### 該当のソースコード ``` ここにご自身が実行したソースコードを書いてください ``` ### 試したこと 課題に対してアプローチしたことを記載してください ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
回答: 後ろのアンダーバーは前とセットで名前を囲っているもにと見なし、その数で強調の度合いを示していると考えるとしっくりきます。 2重のアンダーバーで囲われている名前 ================== 例:`__main__`, `__name__`, `__init__`等 既にドキュメントの参照箇所が提示されている通りですが、気持ち的には「Pythonの世界ですごく特別な何か」位の重み付けで意識すると良いと思います。 1重のアンダーバーで囲われている名前 ================== 例:`ctypes`で使われる`_field_`や`enum`内部での使用 局所的にですが使われているところではすごく意味を持つ名前です。だからこそアンダーバーで囲った、ただし2重にすると別の意味付けになるので1重に囲った名前を使用しているんだと思います。(自分の理解で情報ソースはありません) その他の後ろにアンダーバーが付いている名前(後ろに1つ) ============================ 例:`class_`, `type_`等 コメント欄で言及されている通り、Pythonで予約されている名前を自分でも使いたい時に用いる用法らしいです。例えば`type`に何か代入してもPython的には動くっちゃぁ動くんですが、「元々の`type`を上書きするのはよろしくないマナーだ、みんな代わりに`type_`を使おう!」って感じです。PEP8というすごく基本な内容ですが私は知らなかったです。 その他の後ろにアンダーバーが付いている名前(後ろに2つ以上) ============================== 例:`spam__`, `spam___`等 知る限り特に一般的な意味はないはずですが、これを見かけた人はみんな「何だこれは?」と思うと思います。読む人の注意を引く用途であればそれは許容される名前付けかもしれません。が、意図がなければ避けた方が良い名付けだと思います。