1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonの位置専用引数とキーワード専用引数についてまとめてみた

Posted at

はじめに

Pythonには、引数の受け渡し方法を制御する便利な機能として「位置専用引数」と「キーワード専用引数」がありますが、私自身まだ実際の開発で上手く活用できていないため、今回まとめてみました。

位置専用引数とは?

位置専用引数は、関数に渡す引数を位置順番)でのみ指定可能にする方法です。これにより、引数名を使ったキーワード形式での指定を防ぎます。

宣言方法

位置専用引数は、関数定義時にスラッシュ(/)を使って指定します。スラッシュの前に定義された引数が位置専用引数になります。

def greet(name, /, message):
    return f"{name}さん、{message}"

# 使用例
print(greet("田中", "こんにちは"))      # OK  
print(greet("田中", message="こんにちは"))  # OK  
# print(greet(name="田中", message="こんにちは"))  # エラー (TypeError)

特徴と利点

  • 読みやすさの向上: キーワードを省略することで、シンプルなコードを記述できます。
  • パフォーマンスの向上: 引数解析(特にキーワード引数のマッピング処理)を省略できるため、処理速度が向上するみたいです。

標準ライブラリでの使用例: math モジュール

Pythonの標準ライブラリ math モジュールには、位置専用引数が活用されています。

math.pow の例

import math

# math.powでは引数が位置専用
result = math.pow(2, 3)  # OK
# result = math.pow(x=2, y=3)  # エラー (TypeError)
print(result)  # 出力: 8.0

なぜ位置専用なのか?

math.pow のような関数は計算処理に特化しており、頻繁に呼び出されます。そのため、位置専用引数を使用することで以下が実現されます:

  1. コードの簡潔さ: 順番だけで引数を指定できるため、コードが分かりやすくなります。
  2. パフォーマンスの向上: キーワード引数のマッピング処理を省略することで、関数呼び出しのコストが削減されます。

参考: PEP 570 Positional-Only Parametersのパフォーマンスについて


キーワード専用引数とは?

キーワード専用引数は、引数をキーワード形式でのみ指定可能にする方法です。位置での指定を禁止し、引数名を明示的に指定させます。

宣言方法

キーワード専用引数は、関数定義時にアスタリスク(*)を使って指定します。アスタリスク以降に定義された引数がキーワード専用引数になります。

def greet(*, name, message):
    return f"{message}{name}さん!"

# 使用例
# print(greet("田中", "こんにちは"))  # エラー (TypeError)  
print(greet(name="田中", message="こんにちは"))  # OK  

特徴と利点

  • 引数の順番ミスを防止: キーワードを必須化することで、間違った順序で引数を渡すリスクがなくなります。
  • 意図が明確: 引数名が明示されるため、関数の使い方が直感的に理解できます。

標準ライブラリでの使用例: datetime.datetime

Pythonの標準ライブラリ datetime モジュールでは、キーワード専用引数が使用されているケースがあります。

datetime.datetime.replace の例

from datetime import datetime

dt = datetime(2023, 12, 23, 15, 30, 45)

# replace関数ではキーワード専用引数が活用されている
new_dt = dt.replace(year=2024, month=1)
print(new_dt)  # 出力: 2024-01-23 15:30:45

# 引数名が必須のため、順番を間違える心配がない
# dt.replace(2024, 1)  # エラー (TypeError)

なぜキーワード専用なのか?

replace の引数はオプションで変更したい値のみを指定することを想定しています。キーワード専用にすることで、どの部分を変更しているのかが明確になり、誤った引数の解釈を防ぎます。


位置専用引数とキーワード専用引数の併用

Pythonでは、位置専用引数とキーワード専用引数を同じ関数内で併用することが可能です。

併用の例

def greet(name, /, *, message):
    return f"{name}さん、{message}"

# 使用例
print(greet("田中", message="こんにちは"))  # OK  
# print(greet("田中", "こんにちは"))  # エラー (TypeError)  

利点

  1. 柔軟性の向上: 一部の引数は位置専用にしてシンプルさを保ちつつ、他の引数ではキーワード形式による明確性を維持できます。
  2. エラーの防止: 引数の指定ミスを抑制できます。

まとめ

今回は位置専用引数とキーワード専用引数についてまとめてみました。
これを機に今後の開発に活かしていきたいです!
ご拝読ありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?