Python中不定参数函数*args和**kwargs的使用场景是什么?

我怎么感觉我用不到啊?

def test(*args,**kwargs):
    return args,kwargs


Python中不定参数函数*args和**kwargs的使用场景是什么?
8 回复

printf


简单说,*args用来收任意数量的位置参数,**kwargs用来收任意数量的关键字参数。

最典型的场景是你写一个函数,但不确定调用时会传几个参数,或者你想写一个通用包装函数。

比如写个记录日志的装饰器,被装饰的函数参数未知,这时就可以用:

def log_function_call(func):
    def wrapper(*args, **kwargs):
        print(f"调用 {func.__name__},参数: args={args}, kwargs={kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_function_call
def example(a, b, c=10):
    return a + b + c

print(example(1, 2, c=20))

再比如你要写一个通用数据库查询函数,允许过滤条件不定:

def query_users(**filters):
    base_sql = "SELECT * FROM users"
    if filters:
        conditions = " AND ".join(f"{k}=%s" for k in filters)
        base_sql += f" WHERE {conditions}"
    # 这里省略实际数据库执行
    print(base_sql, list(filters.values()))

query_users(name="Alice", age=25, city="Beijing")

总结:需要灵活接收参数时就用它们。

这是因为 python 不定参要打的字太多了,所以没人用

decorator

比如你做个外卖点单,把客人的单打印在纸上。
客人要点,米饭,番茄炒蛋,酸菜鱼,麻婆豆腐微辣,炒粉丝变态辣。
你就可以愉快的写不定参数和关键字参数了。

就是你不知道有几个参数的时候用到。比如楼上说的关键字参数。

args,中的让 Python 创建一个名为 args 的空元组,比如做一道菜需要的配料,不同客人有不同的要求,所以先创建一个空的元组,具体所用到的配料才写入。
**kwargs,用来接收任意数量的实参,比如个人信息,并不清楚用户会输入什么信息,所以写一个名为 kwargs 的能接受任意数量的关键字实参。

回到顶部