Python 为什么导入的函数;作为「;另一个名称保留其原始名称?

Python 为什么导入的函数;作为「;另一个名称保留其原始名称?,python,function,module,python-import,Python,Function,Module,Python Import,在这里: 我们得到:“存在”。 为什么不“foo”?哪个属性会给出'foo'?您可以将导入foo作为条形图作为一个赋值。当您为函数指定另一个名称时,您不会期望函数更改其\uuuu name\uuuu属性 from os.path import exists as foo print foo.__name__ 谢谢。那么变量bar的哪个属性将返回字符串'bar' 没有这样的属性。名称(bar)单向引用值(函数对象) 函数的\uuu name\uuu属性设置为使用 def…语法。这就是为什么在创建

在这里:

我们得到:
“存在”

为什么不“foo”?哪个属性会给出
'foo'

您可以将
导入foo作为条形图
作为一个赋值。当您为函数指定另一个名称时,您不会期望函数更改其
\uuuu name\uuuu
属性

from os.path import exists as foo
print foo.__name__
谢谢。那么变量
bar
的哪个属性将返回字符串
'bar'

没有这样的属性。名称(
bar
)单向引用值(函数对象)

函数的
\uuu name\uuu
属性设置为使用
def…
语法。这就是为什么在创建匿名函数后,如果定义匿名函数并分配名称
foo
,则无法获得有意义的
\uu名称\uuuu
属性的原因

>>> def foo(): pass
>>> 
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
>foo=lambda:None
>>>foo.\uuuu名称__
''

导入文件/会话中的
as
是语法糖,而
\uuuuu name\uuuuuu
属性是函数对象的一部分。

导入对象只是绑定一个新变量,作为newname添加
所做的一切就是让您为当前名称空间中的变量选择一个替代名称

对象上的
\uuu name\uuu
属性与当前绑定到的名称无关,毕竟,可以有任意数量的变量以及指向同一对象的容器,如列表或字典:

>>> foo = lambda: None
>>> foo.__name__
'<lambda>'
上面创建了4个对函数对象的附加引用;不能有
foo.\uuuu name\uuuuu
反映所有这些,并且
函数列表和
函数字典中的引用(直接)没有名称

由于
import foo
import bar as foo
from module import foo
from module import bar as foo
都只需在当前模块中设置名称
foo
,因此它们的处理方式与其他分配完全相同。您也可以使用不同的名称多次导入函数


相反,函数的
\uu name\uu
值被设置为在
def(…):
语句中定义它时使用的名称。它最多是一个调试辅助工具。例如,它用于回溯,以便更容易识别回溯中显示的代码行。如果有助于更好地识别位置,您只需将
\uuuu name\uuuu
设置为其他值。(注意:在Python3中,还有,它被用来代替
\uuuu name\uuuu
,因为它包含了更多关于嵌套或定义在类上时函数在何处定义的信息)。

@Basj没有这样的属性。名称(
bar
)单向引用值(函数)。@Basj一点也不奇怪。Python名称只是对内存位置的引用
bar='a string'
,那么
'a string'
就不知道它恰好被
bar
引用了,所以
'a string'。\uuu name\uuuu
永远不能是
'bar'
@DeepSpace Ok。我以为会有一个重复的“对象”
,它只会链接到
foo
,这将有其正确的
\uuuuu name\uuuuu
@Basj注意,您的建议意味着:1)每次将函数对象的引用分配给或未分配给新的变量名时,都必须以某种方式对其进行修改2)如果将多个变量名分配给同一个函数引用,则您可以复制该函数或者以某种方式跟踪所有变量名称另一种方法是同一个函数可以被多个变量引用。显然,它只能有一个名字。名称是函数的属性,而不是变量的属性。
from X import Y as Z
相当于
from X import Y;Z=Y;删除Y
。唯一的区别是它不会隐藏导入之前已经存在的名为
Y
的东西,如果它存在,则不会删除(
Y=“Hi”;从X导入Y作为Z
,然后
Y==“Hi”
)。
def foo(): pass

bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {'monty': foo, 'python': foo}