为什么导入的函数“作为”另一个名称保留其原始名称______?

时间:2018-11-13 11:56:02

标签: python function module python-import

这里:

from os.path import exists as foo
print foo.__name__

我们得到:'exists'。 为什么不'foo'呢?哪个属性会给'foo'

3 个答案:

答案 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_functionsdictionary_of_functions中的引用没有(直接)具有名称。

由于import fooimport bar as foofrom module import foofrom module import bar as foo都只在当前模块中设置了名称foo,因此它们的处理方式与其他作业。您也可以使用不同的名称多次导入该函数。

相反,函数的__name__值设置为它在def <name>(...):语句中定义的名称。最多是调试辅助工具。例如,它用于回溯中,以便更轻松地标识回溯中显示的代码行。仅在将__name__设置为其他值时,这样才能更好地识别位置。 (注意:在Python 3中,还有__qualname_ attribute,而不是__name__,因为它包含有关在类上嵌套或定义函数时在何处定义的更多信息。)

答案 2 :(得分:0)

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