一、错误解释
当我们在调用一个函数的时候,如果传入的参数数量与函数定义时不一致,就会产生 takes x positional arguments but y was given 的错误。
其中,x 表示函数定义时期望的位置参数个数,y表示实际传入的位置参数个数。
在特定情况下,还会出现 takes 1 positional argument but 2 were given 或者 takes 2 positional arguments but 3 were given 等类似的错误提示。
二、函数参数
在 Python 中,函数的参数分为两种:位置参数和关键字参数。
位置参数是指通过位置来匹配实参和形参,位置需要严格对应。
比如下面的函数:
def func(a, b, c): pass
它的位置参数分别是 a, b 和 c。
关键字参数则是指通过参数名来匹配实参和形参,与位置无关。
比如下面的函数:
def func(a, b, c): pass
它的关键字参数是 a, b 和 c。
三、错误原因
takes 0 positional arguments but 1 was given 这个错误是因为函数定义时没有参数,但是函数调用时却传入了一个参数。
举个例子:
def hello(): print("Hello, World!") hello("Python")
将产生 takes 0 positional arguments but 1 was given 的错误,因为 hello 函数在定义时没有参数,但是在调用时传入了一个参数。
四、解决方法
1. 添加位置参数
一种方法是在函数定义中添加一个位置参数:
def hello(name): print(f"Hello, {name}!") hello("Python")
这样就可以解决 takes 0 positional arguments but 1 was given 的错误了。
2. 移除多余的参数
另外一种方法是将多余的参数从函数调用中移除:
def hello(): print("Hello, World!") hello()
这样就可以避免 takes 0 positional arguments but 1 was given 的错误了。
3. 使用 *args 和 **kwargs
如果你不确定函数需要多少个参数,可以使用 *args 或者 **kwargs。
*args 表示任意数量的位置参数,它们被打包成一个元组传入函数中。
**kwargs 表示任意数量的关键字参数,它们被打包成一个字典传入函数中。
def hello(*names): for name in names: print(f"Hello, {name}!") hello("Python", "Java")
这个函数接受任意数量的位置参数。
这样也可以避免 takes 0 positional arguments but 1 was given 的错误。
五、总结
takes 0 positional arguments but 1 was given 的错误提示表示在函数调用时给了函数一个参数,但是函数定义时没有接受参数。
遇到这种错误,可以添加位置参数、移除多余的参数,或者使用 *args 和 **kwargs 来解决问题。
对函数参数的理解非常重要,精通函数参数的使用可以避免很多类似的错误。