Pythonのアンダースコア( _ )を使いこなそう!

Neil Wu
LSC PSD
Published in
6 min readDec 10, 2019

Pythonは一番書きやすいプログラミング言語と知られ、多くの人の第二外国語(英語に次ぎ)です。でもGithubやGitlabで他人のコードを参照した時や自分でclassを書いてる時、こういう疑問はあったでしょうか:

「def __init__(self): の__init__のアンダースコアは何故二つなのか?」
「def _func(x): と def func(x): とdef func_(x): に違いはあるのか?」
「y, _ = func(x)のアンダースコアは何か?」

そんな色んな所で使われてるアンダースコアの使い方を、今回整理して説明してみました!

アンダースコアの使い場所

  1. Return値を無視する。
  2. 関数の名付けで使い方を区別する。
  3. 数字を読みやすくする。
  4. インタプリタで最後に表示された値を代表する。

以上4種類の状況でアンダースコアを使いこなす事により、読みやすいpythonicなコードを書くことができます。

1、Return値を無視

x, _, z = (1, 2, 3)
# x=1, z=3
def func_return_2():
return 'a', 'b'
x, _ = funct_return_2()
# x='a'
for i,_ in enumerate(x):
some_function(i)

多分一番多いアンダースコアの使い方です。
Pythonはライブラリが沢山あって、関数をインポートして使う事が多いです。そういう時、もし関数からのreturn値が複数あって使わない部分があったらアンダースコアを使ってreturn値のメモリの占用をしないまま廃棄ができます。

2、関数の名付けで使い方の区別

関数の名付けで使うアンダースコアは、アンダースコアの付ける位置と数で関数の使い方を4種類に区別します。それぞれPEP8のコーディング規約で定義されています。

a、_function(x): #関数前に一つ

def _single_leading_underscore(x):
return something
# weak "internal use" indicator. E.g. from M import * does not
# import objects whose names start with an underscore

関数前に一つアンダースコアを付ける事により、関数を”内部用”に定義できます。他のプログラミング言語のPrivate属性と似たような物ですが、Pythonには事実上のPrivate属性がありませんPEP8の説明ではweak internal useと説明されていて、from M import * の時、では一つのアンダースコアで始まる関数はインポートされませんが、class内の関数だとclassx._func()で関数を呼ぶ事が出来ます。

b、function_(x): #関数後に一つ

def single_trailing_underscore_: 
return something
# used by convention to avoid conflicts with Python keyword, e.g.
# Tkinter.Toplevel(master, class_='ClassName')

関数後に一つアンダースコアを付けるのはPython内の重要関数と名付けを被らせない為です。例えばclass内でどうしてもlistと言う関数や引数を設定したい時は list_ と名付けてPythonのlistと被ることを避けます。

c、__function(x): #関数前に二つ

def __double_leading_underscore: 
return something
# when naming a class attribute, invokes name mangling
# (inside class FooBar, __boo becomes _FooBar__boo; see below).

class内の関数前に二つアンダースコア付けることで、名前の マングリング機構を呼び出します。ここのマングリングとは、インタプリタやコンパイラーが普通の方法で変数を扱わなくなる事です。例えばclass FooBarの関数__booについて、Foobar.__barでは関数を呼べ出せなく、_Foobar__booという使い方になります。擬似的にPrivate属性を作れます。

d、__function__(x): #関数前後に二つずつ

def __double_leading_and_trailing_underscore__: 
return something
# "magic" objects or attributes that live in user-controlled
# namespaces. E.g. __init__, __import__ or __file__. Never invent
# such names; only use them as documented.

class内の関数の前後に二つずつアンダースコア付けることで、magic methodになります。__init__や__call__、__iter__等既存のmagic methodがあってクラスを華やかに書けますが、普段の開発では自分で新しく定義しないことをお勧めします。

3、数字を読みやすく

>>> 1000000
Out: 1000000
>>> 1_000_000
Out: 1000000

Python 3.6以降では、数字を読みやすくする様にアンダースコアを数字内に加える事が出来ます。一般で使われてる3桁ごとにカンマを実現できます。

4、インタプリタで最後に表示された値を代表

>>> 1
Out: 1
>>> _ * 3
Out: 3
>>> _ * 10
Out: 30

インタプリタでは、アンダースコアは最後の表示(expression value)を代表しています。

_結論

アンダースコアは使いこなすと凄く見える!

実は他にも i18n/l10nの使い方がありますが、あまりにも使わないのでスキップしました。
ちなみに _ はアンダーバーやアンダーラインとか呼ばれていますが、英語ではアンダースコア(underscore)が正しい読み方です。__の様にアンダースコアが二回連続で使われてるとdunders (double underscore)と言うかっこいい名前があります。

if you like(this_article):
please(CLAPS)
follow(LSC_PSD)
# Thanks :)

--

--