可接受任意数量参数的函数
使用 * 参数,可以让一个函数接受任意数量的位置参数
def test(arg, *args):
pass
在上述例子中,args 是一个由除 arg 以外所有位置参数组成的元组
使用 ** 参数,可以让一个函数接受任意数量的关键字参数
def test(arg, **kwargs):
pass
在上述例子中,kwargs 是包含被传入进来的关键字参数字典
同时使用 * 和 **,能够让函数接受任意数量的位置参数和关键字参数
只接受关键字参数的函数
将参数放在 * 参数或者单个 * 后面
def test(arg, *, key):
pass
def other_test(arg, *args, key):
pass
在上述例子中,key 必须为关键字参数
仅限位置形参
使用 / 指明某些函数的形参必须使用仅限位置而非关键字参数的形式
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
在上述例子中,a,b 为仅限位置形参,c,d 可以是位置形参也可以是关键字形参,e ,f必须为关键字形参
小技巧(来自 fastapi)
借助 *,带有默认值的参数也可以在不带有默认值的参数前面,例如
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*, item_id: int = Path(..., title="The ID of the item to get"), q: str
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results