如果你希望函数的某些参数强制使用关键字参数进行传递,那么在定义函数时,可以在位置参数结束后添加一个*, *后面的参数就是强制关键字参数。
def func(name: str, age: int, *, address='上海') -> str:
return f"{name}今年{age}岁,住在{address}"
print(func("小明", 10, address='北京'))
使用强制关键字参数在某些情况下会带来非常大的好处,比如一个函数拥有几十个参数的情况,如果都使用位置参数,那么函数在调用时,你很难准确的理解某一位置的参数含义和作用,毕竟参数多大几十个,你无法记住每一个位置参数的作用。但使用强制关键字参数,在函数调用时,就必须使用关键字参数,就像上面的示例,你必须在函数调用时传入关键字参数address,这样做表意更加清晰。
在实际应用中,uvicorn的run函数就使用强制关键字参数
def run(
app: ASGIApplication | Callable[..., Any] | str,
*,
host: str = "127.0.0.1",
port: int = 8000,
uds: str | None = None,
fd: int | None = None,
loop: LoopSetupType = "auto",
****中间省略
)
在你调用uvicorn.run函数时,除了app这个位置参数外,其他的都是强制关键字参数,你必须准确的理解你所传入的参数的含义和作用,在python引入强制关键字参数之前,上面的函数可能会这样定义
def run(
app: ASGIApplication | Callable[..., Any] | str,
**kwargs
)
**kwargs 是可变参数,两者在调用时,其形式是一样的,都可以写成如下的形式
uvicorn.run(app, host="0.0.0.0", port=8800)
看似没有区别,但实际操作时你会明白,run函数使用强制关键字参数比使用可变参数更能提高编程体验,如果使用了强制关键字参数,编辑器例如pycharm可以提示run函数有哪些关键字参数可以传递,而如果使用可变参数,pycharm则无法提供这样的信息,你只能通过阅读源码中函数的文档来了解可变参数**kwargs可以传入哪些关键字参数名称。
QQ交流群: 211426309