为什么导入的函数"as"另一个名称保留其原始__name__?

Bas*_*asj 18 python module function python-import

这里:

from os.path import exists as foo
print foo.__name__
Run Code Online (Sandbox Code Playgroud)

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

tim*_*geb 34

您可以只查看import foo as bar作业.在为函数__name__指定其他名称时,您不希望函数更改其属性.

>>> def foo(): pass
>>> 
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
Run Code Online (Sandbox Code Playgroud)

谢谢.那么变量的哪个属性bar会返回字符串'bar'呢?

没有这样的属性.Names(bar)单向引用值(函数对象).

__name__函数的属性设置为使用
def ...语法定义函数的名称.这就是为什么__name__如果定义匿名函数并foo在创建名称后指定名称,则不会获得有意义的属性.

>>> foo = lambda: None
>>> foo.__name__
'<lambda>'
Run Code Online (Sandbox Code Playgroud)

  • @Basj这一点都不奇怪.Python名称只是对内存位置的引用.`bar ='一个字符串'`,然后`'一个字符串'`不知道它碰巧被`bar`引用,所以''一个字符串'.__ name__`永远不会是''bar' (4认同)
  • 另一种看待这种情况的方法是多个变量可以引用相同的函数.显然,它只能有一个名字.名称是函数的属性,而不是变量的属性. (2认同)

Mar*_*ers 15

导入对象只是绑定一个新变量,所有添加的as newname操作都允许您选择一个替代名称用于当前命名空间中的变量.

__name__对象上的属性没有提到它当前绑定到,你可以有任意数量的变量以及容器,如列表或字典指向同一个对象,毕竟名称:

def foo(): pass

bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {'monty': foo, 'python': foo}
Run Code Online (Sandbox Code Playgroud)

上面创建了4个对函数对象的附加引用; 你不能foo.__name__反映所有这些,并且引用中list_of_functionsdictionary_of_functions不(直接)具有名称.

由于import foo,import bar as foo,from module import foofrom module import bar as foo所有刚刚成立的名字foo在当前模块中,处理它们的确切方式与其他任务一样.您也可以使用不同的名称多次导入该函数.

相反,__name__函数的值设置为在def <name>(...):语句中定义的名称.它至多是一个调试辅助工具.例如,它用于回溯,以便更容易识别回溯中显示的代码行.__name__如果有助于更好地识别位置,您只需将其设置为其他内容.(注意:在Python 3中,还有一个__qualname_属性,而不是__name__因为它包含有关在类上嵌套或定义时定义函数的位置的更多信息).