You have 2 free member-only stories left this month.
Pythonのアンダースコア( _ )を使いこなそう!
Pythonは一番書きやすいプログラミング言語と知られ、多くの人の第二外国語(英語に次ぎ)です。でもGithubやGitlabで他人のコードを参照した時や自分でclassを書いてる時、こういう疑問はあったでしょうか:
「def __init__(self): の__init__のアンダースコアは何故二つなのか?」
「def _func(x): と def func(x): とdef func_(x): に違いはあるのか?」
「y, _ = func(x)のアンダースコアは何か?」
そんな色んな所で使われてるアンダースコアの使い方を、今回整理して説明してみました!
アンダースコアの使い場所
- Return値を無視する。
- 関数の名付けで使い方を区別する。
- 数字を読みやすくする。
- インタプリタで最後に表示された値を代表する。
以上4種類の状況でアンダースコアを使いこなす事により、読みやすいpythonicなコードを書くことができます。
1、Return値を無視
x, _, z = (1, 2, 3)
# x=1, z=3def 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 :)