質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7760閲覧

pythonのアンダーバー(_)の意味について

tarou_yamada

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/05/06 15:26

###前提・実現したいこと
お世話になります。
現在pythonを勉強中です。

変数や関数の頭か後ろにアンダーバーがついているのをよく見かけるのですが、そのうち、後ろについている場合の意味が理解できていません。
頭についている場合は、参照に制限をかけていることはすぐに調べられたのですが、後ろについている場合を説明しているサイトや参考書が見当たりませんでした。
例:____name____や____init____など

ご理解されている方がいらっしゃましたら、ご教示のほどお願い申し上げます。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

後ろのアンダーバーは前とセットで名前を囲っているもにと見なし、その数で強調の度合いを示していると考えるとしっくりきます。

2重のアンダーバーで囲われている名前

例:__main__, __name__, __init__

既にドキュメントの参照箇所が提示されている通りですが、気持ち的には「Pythonの世界ですごく特別な何か」位の重み付けで意識すると良いと思います。

1重のアンダーバーで囲われている名前

例:ctypesで使われる_field_enum内部での使用

局所的にですが使われているところではすごく意味を持つ名前です。だからこそアンダーバーで囲った、ただし2重にすると別の意味付けになるので1重に囲った名前を使用しているんだと思います。(自分の理解で情報ソースはありません)

その他の後ろにアンダーバーが付いている名前(後ろに1つ)

例:class_, type_

コメント欄で言及されている通り、Pythonで予約されている名前を自分でも使いたい時に用いる用法らしいです。例えばtypeに何か代入してもPython的には動くっちゃぁ動くんですが、「元々のtypeを上書きするのはよろしくないマナーだ、みんな代わりにtype_を使おう!」って感じです。PEP8というすごく基本な内容ですが私は知らなかったです。

その他の後ろにアンダーバーが付いている名前(後ろに2つ以上)

例:spam__, spam___

知る限り特に一般的な意味はないはずですが、これを見かけた人はみんな「何だこれは?」と思うと思います。読む人の注意を引く用途であればそれは許容される名前付けかもしれません。が、意図がなければ避けた方が良い名付けだと思います。

投稿2017/05/06 18:41

編集2017/05/07 01:19
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argparse

2017/05/06 20:17

末尾に 1 つだけアンダースコアをつける書き方は、予約語を避ける目的でたまに使われていたりしますね。以下のように、 PEP 8 でも言及されています。 https://pep8-ja.readthedocs.io/ja/latest/#id25 > single_trailing_underscore_: Python のキーワードと衝突するのを避けるために使われる規約です。例を以下に挙げます: > > Tkinter.Toplevel(master, class_='ClassName') おかげで `operator` モジュールとか見ると、 trailing underscore だらけでちょっとブキミです。
YouheiSakurai

2017/05/07 01:23

ありがとうございます、とても勉強になりました。いつも「typeとclassはどうしたらいいんだろう、とりあえず気持ち悪いけど前に一個かな」って自分流だったのでこれからはスッキリしそうです。本文にも追記しました。
tarou_yamada

2017/05/07 04:04

ご回答ありがとうございます。 細かいところまでのご説明に目から鱗で、 非常に勉強になりました! ありがとうございました!
guest

0

Python公式ドキュメント
2.3.2. 予約済みの識別子種より

__*__
システムで定義された (system-defined) 名前です。これらの名前はインタプリタと (標準ライブラリを含む) 実装上で定義されています; 現行のシステムでの名前は 特殊メソッド名 などで話題に挙げられています。

投稿2017/05/06 15:55

編集2017/05/06 16:10
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarou_yamada

2017/05/07 03:59

早速のご回答ありがとうございます。 一番見るべきところを見れておりませんでした。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問