Python 为什么内置函数类在尝试引用它时抛出NameError?

Python 为什么内置函数类在尝试引用它时抛出NameError?,python,Python,我不明白为什么在执行的时候 def foo(): pass print(type(foo)) print(isinstance(foo, function)) foo = list() print(type(foo)) print(isinstance(foo, list)) 输出是 <class 'function'> NameError: name 'function' is not defined <class 'list'> True 输出是

我不明白为什么在执行的时候

def foo():
    pass

print(type(foo))
print(isinstance(foo, function))
foo = list()

print(type(foo))
print(isinstance(foo, list))
输出是

<class 'function'>
NameError: name 'function' is not defined
<class 'list'>
True
输出是

<class 'function'>
NameError: name 'function' is not defined
<class 'list'>
True

真的

函数
显然是有效类时,为什么第一次执行会导致
名称错误
?提前感谢。

function是用户定义函数的实现类的名称,但它不是公开的名称(不是任何地方都可以看到的内置名称的一部分)

对于类似的示例,想象一个名为
foomodule.py
的模块,其中包含以下内容:

class Foo:
    pass

def make_foo():
    return Foo()
如果在其他模块中执行此操作:

from foomodule import make_foo

x = make_foo()
print(type(x))
它将告诉您它是一个
foomodule.Foo
。但如果你这样做了:

print(isinstance(x, foomodule.Foo))
您将得到一个
名称错误
,因为您在当前范围内实际上看不到该限定名称;它是存在的,但它并没有在您寻找它的地方“发布”(当前模块的全局范围)

类似地,
函数
类实现了用户定义的函数,但它不是直接发布的

碰巧,您可以在
types
模块上找到它作为
types.FunctionType
发布,但它们以与您相同的方式获得对它的引用;通过定义用户定义的函数并对其调用
type
。该类型在Python级别上没有直接公开,只是为了避免使用
type
从现有函数中提取它


内置还有其他例子,例如,
type(None)
是一个名为
NoneType
的类,但访问它的唯一方法是通过
type(None)
;没有理由直接发表。您不能以有用的方式手动创建自己的
NoneType
实例;类似地,用户定义的函数是使用
def
生成的,而不是
函数
构造函数。

请检查此项-您不了解什么?内置名称空间中没有名称
函数
,您也没有在任何地方定义该变量。不过,有一种类型是函数对象的类型。它是公开的,只是不在内置的名称空间中。@juanpa.arrivillaga:这一个几乎不公开,并且只有在所有类都公开的情况下,如果您有权访问它们的实例。我觉得我已经说得相当清楚了(我描述了我所说的“不暴露”的意思,并向你展示了如何接触到它)。