Python 函数接受/传递参数时 *(星号) 的作用

最近在看fastapi,里面很多地方用的 * ,这个是为什么存在,为什么要加上 * 呢,希望有大佬解释一下

这类问题用搜索引擎搜一下就可以找到很多相关内容:

辉哥,我知道怎么用,我写一下代码

def func(a, b):
    print(a, b)

func(1, 2)


def bar(*, a, b):
    print(a, b)

bar(a=1, b=2)

在func里面,没有加 * 可以,直接传递值(位置参数),但是在bar里面,就得使用关键字参数去传递,我的疑惑是,既然能用位置参数去调用(即func的调用方式),为什么要用bar那样去调用呢,仅仅是把调用时参数由位置参数,改成关键字参数,仅这一点用处吗

为什么要用bar那样去调用呢,仅仅是把调用时参数由位置参数,改成关键字参数,仅这一点用处吗

据我所知,是这样的,就是为了强制调用时使用关键字方式传递参数。

找到一个相关的问题:

1 Like

好的,谢谢辉哥

1 Like

这种语言问题,推荐还是直接阅读 PEP 3102 掌握第一手资料。

keyword-only arguments就是用在当你需要对这个函数做额外的约束(选项)的时候用的,位置参数和关键字参数语义也有差别,不能认为位置参数更好,特别地,当你需要一个不定长度的位置参数,以及关键字参数一起使用时,问题来了:

def foo(*args, option=None):
    ...

这会产生语法错误,那你问,为什么我不把option放前面去?好的,这意味着所有原先用到这个函数的地方都要改动。那我们一般如何做呢?再用一个**kwargs

def foo(*args, **kwargs):
    option = kwargs.pop("option", None)
    ...

不要觉得这脱离实际,这个略显丑陋的写法在PEP 3102之前比比皆是,而你用keyword-only arguments的话:

def foo(*args, *, option=None):
    ...

完美工作,而且,你还可以在默认参数后面加强制参数:

def foo(a=1, *, option):
    ...

不用keyword-only arguments,你无法做到

2 Likes