---
tags: Python
---
# Arguments
## *args
> The ***args** will give you all function parameters as a tuple.
> The special syntax ***args** in function definitions in python is used to pass a variable number of arguments to a function. It is used to pass a non-keyworded, variable-length argument list.
## **kwargs
> The special syntax ****kwargs** in function definitions in python is used to pass a keyworded, variable-length argument list.
## Special parameters
先來個懶人包:
```python
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
----------- ---------- ----------
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
```
### Positional-only Arguments
`/` 前面的 argument 必須要以 positional 的方式給,否則會跳 `TypeError` 。
```python
def func(a, /, b):
print(a, b)
>>> func(1, 2)
1 2
>>> func(a=1, b=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
func(a=1, b=2)
TypeError: func() got some positional-only arguments passed as keyword arguments: 'a'
```
### Keyword-Only Arguments
`*` 後面的 argument 必須要以給 key 的方式執行,否則會跳 `TypeError`。
```python
def func(a, *, b=None):
print(a, b)
>>> compare(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: compare() takes 1 positional arguments but 2 were given
>>> compare(1, b=2)
1 2
```
## 參考資料
- [More Control Flow Tools / Python](https://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions)
- [PEP 3102 -- Keyword-Only Arguments](https://www.python.org/dev/peps/pep-3102/)