Python

【Python】特殊な引数の使い方【位置専用・キーワード専用・任意引数リスト】

この記事では、Pythonの特殊な引数の使い方を解説します。仮引数にオプションを記述することで、呼び出し方を強制したり、複数の要素を受け取ったりすることができます。それでは、特殊な引数の使い方を見ていきましょう!

位置専用引数

仮引数の後ろに/(スラッシュ)を記述することで、それよりも前の仮引数は全て位置専用引数になります。

def 関数名(引数, /):
    なんらかの処理

サンプル

例として、位置専用引数を定義した関数を「通常の呼び出し」と「キーワード呼び出し」で使ってみます。

def func(arg, /):
    print(arg)

func(0)
func(arg=0)

実行結果

0
Traceback (most recent call last):
  File "main.py", line 8, in <module>
    func(arg=0)
TypeError: func() got some positional-only arguments passed as keyword arguments: 'arg'

使い所

辞書の可変長引数を受け取る関数で、keyと引数名が被ってしまった場合に、名前の衝突を避けることができます。

例えば、以下のコードを見てください。

def func(name, **kwds):
    print(name, kwds['name'])

person = {'name': 'Mike'}
func('John', **person)

このコードを実行するとname引数に複数の値が渡され、TypeErrorが発生します。しかし、以下のように位置専用引数にすることで、このエラーは回避できます。

# nameを位置専用に
def func(name, /, **kwds):
    print(name, kwds['name'])

person = {'name': 'Mike'}
func('John', **person)

キーワード専用引数

仮引数の前に*(アスタリスク)を記述することで、それよりも後ろの仮引数は全てキーワード専用引数になります。

def 関数名(*, arg):
    なんらかの処理

サンプル

例として、キーワード専用引数を定義した関数を「通常の呼び出し」と「キーワード呼び出し」で使ってみます。

def func(*, arg):
    print(arg)

func(arg=0)
func(0)

実行結果

0
Traceback (most recent call last):
  File "main.py", line 8, in <module>
    func(0)
TypeError: func() takes 0 positional arguments but 1 was given

位置専用 + キーワード専用

1つの関数に位置専用とキーワード専用の引数を定義することができます。

def 関数名(位置専用, ..., /, 通常, ..., *, キーワード専用, ...):
    なんらかの処理

サンプル

試しに、どちらの引数も定義した関数を呼び出してみます。

def func(pos, /, nor, *, key):
    print(pos, nor, key)

func('pos', 'nor', key='key')

# もちろんnor引数はキーワード呼び出しもできる
func('pos', nor='nor', key='key')

実行結果

pos nor key
pos nor key

任意引数リスト

仮引数の前に*(アスタリスク)を付けることで、任意の個数の引数で呼び出せるようにでき、それ以降の引数をキーワード呼び出し専用にすることができます。

def 関数名(*引数):
    なんらかの処理
任意引数リストと記述しましたが、値はタプルとして受け取られます

サンプル

以下のサンプルでは、引数で受け取った複数の文字列を連結し、任意の文字数に分割して返す関数を定義しています。

def func(*s, step=1):
    s = ''.join(s)
    return [s[i:i+step] for i in range(0, len(s), step)]


print(func('abc', 'd', 'efgh', step=2))

実行結果

['ab', 'cd', 'ef', 'gh']

まとめ

この記事では、Pythonで特殊な引数を定義する方法を解説しました。

引数を位置専用やキーワード専用にすることで、無駄な呼び出し方法を強制して関数の使い方を明確化することができます。

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』