为什么`function`在Python中不是关键字?

时间:2018-08-31 21:11:53

标签: python class built-in

诸如strtype的类

>>> type("pear")
<class 'str'>
>>> type(str)
<class 'type'>

可在Python中访问:

>>> str
<class 'str'>
>>> type
<class 'type'>

但是,类functionbuiltin_function_or_method不是。

>>> def foo(): pass
... 
>>> type(foo)
<class 'function'>
>>> type(print)
<class 'builtin_function_or_method'>

它们显示为内置类,但尝试访问它们会引发名称错误:

>>> function
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined
>>> builtin_function_or_method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'builtin_function_or_method' is not defined

functionbuiltin_function_or_method有什么特别之处?

3 个答案:

答案 0 :(得分:13)

您看到的是函数类型的representation

>>> from types import FunctionType
>>> repr(FunctionType)
"<class 'function'>"

这是用def或其他方式定义的函数的“类型”:

>>> def f():
...     pass
... 
>>> type(f) is FunctionType
True
>>> type(lambda: None) is FunctionType
True

“功能”本身并不是语法,因为键入“ def”更容易。

一个反问:如果def是用来解析为函数类型的名称,那么what syntax would you use会实际上定义一个函数?

答案 1 :(得分:4)

类和函数有一个固有名称:

>>> def foo():
...     pass
...
>>> foo
<function foo at 0x10f951400>
>>> foo.__name__
'foo'

附加到对象的名称独立于用于访问对象的名称,尽管在定义函数(和类)时,它们是相同的。

>>> bar = foo
>>> bar
<function foo at 0x10f951400>

只要在其他地方有引用,您甚至可以摆脱用于访问该函数的变量:

>>> funcs = [foo]
>>> funcs[0]
<function foo at 0x10f951400>
>>> del foo
>>> foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> funcs[0]
<function foo at 0x10f951400>
>>> funcs[0].__name__
'foo'

内置函数类型如下:没有引用它的变量,但它仍然存在,并且具有__name__

>>> def foo(): pass
...
>>> type(foo)
<class 'function'>
>>> type(foo).__name__
'function'

答案 2 :(得分:3)

Type Object函数(或object.__class__)返回type()

您可以获得这些类型对象here的完整列表。

但是您也可以创建自己的:

>>> import types
>>> types.new_class('my_made_up_type')
<class 'types.my_made_up_type'>

因此某些对象(例如内置函数)返回的类型对象是types.BuiltinFunctionType,但是这些类型对象不是内置类,因此也就不足为奇了在解释器中未定义