DEV Community

codemee
codemee

Posted on

Python 參數中的 '/' 與 '*'

在查看一些 Python 文件時常會看到參數中出現 /*, 一開始沒有太注意, 後來才發現原來是有意義的, 簡單的來說:

  • /:表示出現在它前面的參數只能是以對應位置傳入資料, 不能用指名的方式。
  • *:表示出現在它之後的參數只能用指名的方式傳入資料。

這樣講可能有點抽象, 以底下這個函式為例:

>>> def foo(n, /, a, b=2, *, c):
...     print(f'{n=}')
...     print(f'{a=}')
...     print(f'{b=}')
...     print(f'{c=}')
Enter fullscreen mode Exit fullscreen mode

救代表:

  • n 必須是位置引數
  • a 可以是位置引數或是指名引數
  • b 可以是位置引數或是指名引數
  • c 必須是指名引數

在叫用 foo 的時候就必須要符合以上規定, 以下都是不符合規定的狀況:

>>> foo(n=10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got some positional-only arguments passed as keyword arguments: 'n'
Enter fullscreen mode Exit fullscreen mode

由於 n 只能以位置參數傳入資料, 所以錯誤訊息明白告訴你把只能依照位置傳入的引數當指名引數用了。

>>> foo(10, 20)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() missing 1 required keyword-only argument: 'c'
Enter fullscreen mode Exit fullscreen mode

這樣 n 是 10, a 是 20, b 是預設的 2, 但是 c 沒有值, 所以也不行。

>>> foo(10, 20, 30)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() missing 1 required keyword-only argument: 'c'
Enter fullscreen mode Exit fullscreen mode

由於 c 必須以指名方式傳入資料, 所以即使多加了一項資料, 也不符合規定。

>>> foo(10, 20, c=30)
n=10
a=20
b=2
c=30
Enter fullscreen mode Exit fullscreen mode

這樣就對了。注意到由於以位置傳資料的引數必須出現在定名稱傳資料的參數之前, 所以也不能這樣叫用:

>>> foo(10, a=20, 25, c=30)
Enter fullscreen mode Exit fullscreen mode

否則 b 變成是以位置傳入資料, 但是卻又出現在指名傳資料的 a 後面了。

你自己不一定會這樣設定參數, 但是許多套件內的模組為了傳遞資料的彈性, 又必須讓你知道傳遞資料時的規範, 都會使用這樣的方式設定參數, 瞭解它們的意義才能看懂文件, 運用正確的方式叫用函式或方法。

Top comments (0)