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:这一个几乎不公开,并且只有在所有类都公开的情况下,如果您有权访问它们的实例。我觉得我已经说得相当清楚了(我描述了我所说的“不暴露”的意思,并向你展示了如何接触到它)。