这里:
from os.path import exists as foo
print foo.__name__
我们得到:'exists'
。
为什么不'foo'
呢?哪个属性会给'foo'
?
答案 0 :(得分:35)
您可以将import foo as bar
视为一项作业。为函数分配其他名称时,您不会期望函数会更改其__name__
属性。
>>> def foo(): pass
>>>
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
谢谢。变量
bar
的哪个属性将返回字符串'bar'
?
没有这样的属性。名称(bar
单向引用值(函数对象)。
将函数的__name__
属性设置为使用
定义函数的名称
def ...
语法。这就是为什么如果您定义匿名函数并在创建后命名__name__
时就没有有意义的foo
属性的原因。
>>> foo = lambda: None
>>> foo.__name__
'<lambda>'
答案 1 :(得分:16)
导入对象只是绑定一个新变量,而添加as newname
所做的只是让您选择一个替代名称来用于当前命名空间中的变量。
对象上的__name__
属性没有说明其当前绑定的名称,毕竟,您可以具有任意数量的变量以及指向同一对象的容器,例如列表或字典:< / p>
def foo(): pass
bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {'monty': foo, 'python': foo}
上面创建了对功能对象的4个附加引用;您无法让foo.__name__
反映所有这些,并且list_of_functions
和dictionary_of_functions
中的引用没有(直接)具有名称。
由于import foo
,import bar as foo
,from module import foo
和from module import bar as foo
都只在当前模块中设置了名称foo
,因此它们的处理方式与其他作业。您也可以使用不同的名称多次导入该函数。
相反,函数的__name__
值设置为它在def <name>(...):
语句中定义的名称。最多是调试辅助工具。例如,它用于回溯中,以便更轻松地标识回溯中显示的代码行。仅在将__name__
设置为其他值时,这样才能更好地识别位置。 (注意:在Python 3中,还有__qualname_
attribute,而不是__name__
,因为它包含有关在类上嵌套或定义函数时在何处定义的更多信息。)
答案 2 :(得分:0)
as
是导入文件/会话中的语法糖,而__name__
属性是函数对象的一部分。