【发布时间】:2014-01-20 02:49:20
【问题描述】:
为什么会有代码
print("Average =" (sum/count))
产生类型错误而不是语法错误,视为缺少逗号?
谢谢。
【问题讨论】:
为什么会有代码
print("Average =" (sum/count))
产生类型错误而不是语法错误,视为缺少逗号?
谢谢。
【问题讨论】:
解释器将该行视为函数调用,函数必须是"Average =",但这是不可能的,因为str 不可调用。所以你得到一个类型错误异常。
>>> print("Average =" (sum/count))
# ^^^^^^^^^^^ ^^^^^^^^^
# fct name arg1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
可调用对象是其类实现__call__ 函数的对象。在某些情况下它很有用(参见下面的链接),但 str 类型没有实现它(因为它没有意义)。
更多关于可调用对象的信息:Python __call__ special method practical example
【讨论】:
Python 将() 视为函数调用;字符串不可调用导致TypeError:
>>> "somestring"(42)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
在 Python 中,everything 是一个对象;函数也是对象,任何对象都可以实现__call__ 方法,使每个对象都可能被调用。 Python 直到运行时才知道字符串对象是不可调用的,所以这不是语法错误。
【讨论】:
print(sum (sum/count)) 也会导致类型错误,即使涉及的所有变量都是整数,那么这与不可调用的字符串有什么关系?
sum 是一个整数。
sum 成为内置函数,那么您不能这样使用它,因为您通过在代码中为 sum 分配不同的值来掩盖它。
这是函数调用的有效语法(如果 "Average =" 被替换为方法名称怎么办?),你不能调用字符串。
【讨论】: