类型错误:“元组”对象在 Python 中不可调用 [已修复]

TypeError: ‘tuple’ 对象在 Python 中不可调用

TypeError: ‘tuple’ object is not callable in Python

Python“TypeError: ‘tuple’ object is not callable”发生在我们尝试像调用函数一样调用元组时。

要解决该错误,请确保在访问特定索引处的元组时使用方括号,例如my_tuple[0].

typeerror 元组对象不可调用

这是错误如何发生的一个示例。

主程序
my_tuple = ('a', 'b', 'c') # ⛔️ TypeError: 'tuple' object is not callable my_tuple(0) # 👈️ uses parentheses instead of square brackets

问题是我们在访问特定索引处的元组时使用圆括号而不是方括号。

使用方括号访问索引处的元组

访问元组的元素时使用方括号。

主程序
my_tuple = ('a', 'b', 'c', 'd') print(my_tuple[0]) # 👉️ 'a' print(my_tuple[1]) # 👉️ 'b' print(my_tuple[2]) # 👉️ 'c'

Python 索引是从零开始的,因此元组中的第一项的索引为0,最后一项的索引为-1or len(my_tuple) - 1

如果需要获取元组的一部分,也应该使用方括号。

主程序
my_tuple = ('a', 'b', 'c', 'd') print(my_tuple[0:2]) # 👉️ ('a', 'b') print(my_tuple[2:4]) # 👉️ ('c', 'd')

元组切片的语法

my_tuple[start:stop:step].

索引start是包含的,stop索引是排他的(最多,但不包括)。

如果start省略索引,则认为是0,如果stop省略索引,则切片转到元组的末尾。

常见错误原因

出现错误的原因有多种:

  • 尝试使用圆括号()而不是方
    括号访问元组
    []
  • 具有同名的函数和变量。
  • 错误地覆盖内置函数并将其设置为元组。
  • 具有同名的类方法和类属性。
  • 调用一个返回元组两次的函数。

确保你没有覆盖tuple()函数

另一件需要注意的事情是您没有覆盖内置的
tuple()函数。

主程序
# 👇️ overriding built-in tuple() function tuple = ('a', 'b', 'c') # ⛔️ TypeError: 'tuple' object is not callable result = tuple(['d', 'e', 'f'])

要解决这种情况下的错误,请重命名变量并重新启动脚本。

主程序
# ✅ no longer overriding built-in tuple() function my_tuple = ('a', 'b', 'c') result = tuple(['d', 'e', 'f'])

忘记在列表中的两个元组之间放置逗号

确保没有两个元组相邻且没有用逗号分隔。

主程序
# ⛔️ TypeError: 'tuple' object is not callable my_list = [('a', 'b') ('c', 'd')]

列表中的两个元组之间缺少一个逗号,因此 Python 认为我们正在尝试调用第一个元组。

要解决该错误,请在元组之间放置一个逗号。

主程序
my_list = [('a', 'b'), ('c', 'd')]

尝试将元组作为函数调用会导致错误

错误的另一个常见原因是简单地尝试将元组作为函数调用。

主程序
my_tuple = ('a', 'b', 'c') # ⛔️ TypeError: 'tuple' object is not callable my_tuple()

要解决该错误,您要么必须删除括号,要么弄清楚如何为变量分配元组而不是函数或类。

主程序
my_tuple = ('a', 'b', 'c') print(my_tuple) # 👉️ ('a', 'b', 'c')

一旦我们删除了括号,我们就能够毫无问题地打印元组。

如果错误地为变量分配了元组,则必须更正分配。

函数和变量同名

确保您没有同名的函数和变量。

主程序
def example(): return 'bobbyhadz.com' example = ('a', 'b', 'c') # ⛔️ TypeError: 'tuple' object is not callable print(example())
变量example隐藏同名函数,所以当我们尝试调用函数时,我们实际上最终调用了变量。

重命名变量或函数可以解决错误。

主程序
def example(): return 'bobbyhadz.com' my_tuple = ('a', 'b', 'c') print(example()) # 👉️ bobbyhadz.com

现在元组和函数的名称不同,不再冲突,问题已解决。

# 具有同名的类方法和类属性

当我们有一个类方法和一个同名的类属性时,也会导致错误。

主程序
class Employee(): def __init__(self, tasks): # 👇️ this attribute hides the method self.tasks = tasks # 👇️ same name as class variable def tasks(self): return self.tasks emp = Employee(('dev', 'test')) # ⛔️ TypeError: 'tuple' object is not callable print(emp.tasks())

该类Employee具有同名的方法和属性。

属性隐藏了方法,所以当我们尝试在类的实例上调用方法时,我们得到对象不可调用的错误。

要解决该错误,您必须重命名类方法。

主程序
class Employee(): def __init__(self, tasks): self.tasks = tasks def get_tasks(self): return self.tasks emp = Employee(('dev', 'test')) print(emp.get_tasks()) # 👉️ ('dev', 'test')

属性和方法现在有了不同的名称,因此问题已解决。

# 调用一个返回元组两次的函数

当您调用两次返回元组的函数时,也会发生该错误。

主程序
def my_func(): return ('bobby', 'hadz', 'com') # ⛔️ TypeError: 'tuple' object is not callable print(my_func()())

第一组括号调用函数,函数返回一个元组。

The second set of parentheses tries to call the tuple as a function and causes
the error.

Remove the second set of parentheses to resolve the issue.

main.py
def my_func(): return ('bobby', 'hadz', 'com') print(my_func()) # 👉️ ('bobby', 'hadz', 'com')

# How tuples are constructed in Python

In case you declared a tuple by mistake, tuples are constructed in multiple
ways:

  • Using a pair of parentheses () creates an empty tuple
  • Using a trailing comma – a, or (a,)
  • Separating items with commas – a, b or (a, b)
  • Using the tuple() constructor

# Conclusion

To solve the “TypeError: ‘tuple’ object is not callable” error, make sure:

  • You aren’t trying to access a tuple with parentheses () instead of square
    brackets [].
  • You don’t have a function and a variable with the same name.
  • You aren’t overriding a built-in function and setting it to a tuple.
  • You don’t have a class method and a property with the same name.
  • You aren’t calling a function that returns a tuple twice.

# Additional Resources

You can learn more about the related topics by checking out the following
tutorials: