早先对 Python *args, **kwargs 参数有所了解,也知道参数列表中的/表示 Positional Only,*很少见。然而在使用 FastAPI 时看到路由函数中表示默认值采用了...的方式又重新激发起我对 Python 函数参数的*,/,*args, 和**kwargs的兴趣。
如 FastAPI 官方文档 Request Forms and Files 中的@app.post("/files/")
默认值的
async def create_file(file: bytes = File(...), fileb: UploadFile = File(...), token: str = Form(...)):File(...),Form(...), 起初还以为...只是真正意义上的省略号,使用时需传入适当的参数,后来发现...居然是一个 Python 实实在在的内置对象。 Read More
本文为阅读 《Python Tricks: The Book》一书的 3.5 Function Argument Unpacking 的笔记与扩充理解。函数参数拆解是定义可变参数(VarArgs)*args和**kwargs的反向特性。*args和**kwars是函数可定义一个形参来接收传入的不定数量的实参。
而这里的函数参数拆解是形参定义多个,在调用时只传入一个集合类型对象(带上 * 或 ** 前缀),如list,tuple,dict, 甚至是generator, 然后函数能自动从集合对象中取得对应的值。
如果能理解下面赋值时的参数拆解和 Python 3.5 的新增***操作,那么于本文讲述的特性就好理解了。
唯一的不同时作为参数的集合传入函数时必须前面加上*或**, 以此宣告该参数将被拆解,而非一个整体作为一个函数参数。加上*或**与 Java 的@SafeVarargs有类似的功效,最接近的是 Scala 的 `foo(Array[String]("d", "e") : _*)` 写法。参见:Java 和 Scala 调用变参的方式 Read More