python函数的强制关键字参数

如果你希望函数的某些参数强制使用关键字参数进行传递,那么在定义函数时,可以在位置参数结束后添加一个*, *后面的参数就是强制关键字参数。

def func(name: str, age: int, *, address='上海') -> str:
    return f"{name}今年{age}岁,住在{address}"


print(func("小明", 10, address='北京'))
  • name, age 是位置参数,在age后面的* 并不是参数,它的作用是标识后面的参数都是强制关键字参数
  • 调用函数时,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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案