目录
TypeError: takes 0 positional arguments but 1 was given
TypeError: 采用 0 个位置参数但给出了 1 个
Python“TypeError: takes 0 positional arguments but 1 was given”的出现有多种原因:
self
忘记在类方法中指定参数。- 忘记在函数中指定参数。
- 将参数传递给不接受任何参数的函数。
- 错误地覆盖了内置函数。
self
忘记在类方法中指定参数
下面是错误如何发生的示例。
class Employee(): # 👇️ forgot to take self arg def get_name(): return 'Bobby Hadz' emp = Employee() # ⛔️ TypeError: Employee.get_name() takes 0 positional arguments but 1 was given print(emp.get_name())
self
我们忘记在类方法的定义中指定参数get_name
。
self
Python在调用类方法时会自动传递给类方法,因此不带参数的方法会被传递给导致错误的方法。class Employee(): # 👇️ specify self arg def get_name(self): return 'Bobby Hadz' # ✅ create instance of the class emp = Employee() print(emp.get_name()) # 👉️ "Bobby Hadz"
self表示类的实例 – 调用方法的实例。
在方法的定义中指定self
参数可以解决错误。
如果您的方法将self
其作为第一个参数,请确保在类的实例而不是类本身上调用该方法。
如果您的方法不使用参数,请使用静态self
方法
如果您的方法不使用参数self
,您可以声明一个
静态方法。
class Employee(): @staticmethod def get_name(): return 'Bobby Hadz' emp = Employee() print(emp.get_name()) # 👉️ "Bobby Hadz"
静态方法不接收隐式第一个参数,可以在类或类的实例上调用。
忘记在函数定义中指定参数
当您忘记在函数定义中指定参数或将参数传递给不接受任何参数的函数时,也会导致该错误。
def get_list(): return ['a', 'b', 'c'] # ⛔️ TypeError: get_list() takes 0 positional arguments but 1 was given result = get_list('a')
该get_list
函数不接受任何参数,但在调用时会传递 1。
在这种情况下,我们要么必须更新函数的声明并获取参数,要么从函数调用中删除参数。
下面是从函数调用中删除参数的示例。
def get_list(): return ['a', 'b', 'c'] result = get_list() print(result) # 👉️ ['a', 'b', 'c']
这是在函数定义中指定参数的示例。
def get_list(x): return ['a', 'b', 'c', x] result = get_list('d') print(result) # 👉️ ['a', 'b', 'c', 'd']
覆盖内置方法和类
错误的另一个常见原因是通过声明具有相同名称的函数来覆盖内置函数和类。
def str(): return 'bobbyhadz.com' # ⛔️ TypeError: str() takes 0 positional arguments but 1 was given result = str(123)
我们声明了一个str
隐藏内置str
类的函数。
当我们调用str()时,我们实际上是在调用我们自己的函数,而不是内置类。
确保您没有与内置函数共享相同名称的函数。
TypeError: 采用 0 个位置参数,但给出了 2 个
Python“TypeError: takes 0 positional arguments but 2 were given”的出现有多种原因:
- 忘记指定函数的参数。
- 将 2 个参数传递给不带任何参数的函数。
- 错误地覆盖了内置函数。
self
忘记在类方法中指定arg。
忘记指定函数的参数
下面是错误如何发生的示例。
def do_math(): return a + b # ⛔️ TypeError: do_math() takes 0 positional arguments but 2 were given result = do_math(10, 15)
我们忘记指定do_math
函数接受的参数并调用函数传递给它的2
参数导致错误。
要解决该错误,请确保在其定义中指定函数采用的参数。
def do_math(a, b): return a + b result = do_math(10, 15) print(result) # 👉️ 25
现在该函数接受2
参数 –a
并b
传递 2 个参数,因此错误得到解决。
如果您的函数不需要接受任何参数但被调用 with 2
,则必须从函数调用中删除参数。
def do_math(): return 10 + 10 result = do_math() print(result) # 👉️ 20
现在该函数不接受任何参数,也不会传递任何参数。
指定self
为类中的第一个参数
如果在使用类时出现错误,请确保将其指定self
为类方法中的第一个参数。
class Employee(): # 👇️ specify self as first arg def get_name(self, name): return name emp = Employee() print(emp.get_name('Bobby Hadz')) # 👉️ "Bobby Hadz"
self
Python在调用时自动传递给类方法。self
代表类的一个实例,所以当我们将一个变量赋值为
如果不在self
方法中使用关键字,则使用静态方法
如果您的方法不使用参数self
,您可以声明一个
静态方法。
class Employee(): @staticmethod def get_name(name): return name emp = Employee() print(emp.get_name('Bobby Hadz')) # 👉️ "Bobby Hadz"
静态方法不接收隐式第一个参数,可以在类或类的实例上调用。
确保您没有通过声明同名的函数来覆盖任何内置函数或类,这也可能导致错误。