python函数可以调用具有相同名称的全局函数吗?
问题内容:
我可以从具有相同名称的函数中调用全局函数吗?
例如:
def sorted(services):
return {sorted}(services, key=lambda s: s.sortkey())
通过{sorted}
我的意思是,全球排序功能。有没有办法做到这一点?然后,我想使用模块名称调用函数:
service.sorted(services)
我想使用相同的名称,因为它与全局函数具有相同的功能,只是它添加了默认参数。
问题答案:
Python的名称解析方案(有时称为“LEGB
规则”)意味着,当您在函数中使用不合格的名称时,Python最多搜索四个范围- 首先
是本地(L)范围,然后是任何封闭的(E)的本地范围def
s和lambda
s,然后是全局(G)范围,最后是内置(B)范围。(请注意,一旦找到匹配项,它将立即停止搜索)
因此,当您sorted
在函数内部使用时,解释器会将其视为 全局
名称(您的函数名称),因此您将拥有递归函数。如果要访问内置函数,则sorted
需要为Python指定。按__builtin__
模块(
在Python-2.x中
)和builtins
在Python-3.x中(此模块提供对Python的所有“内置”标识符的直接访问)
蟒蛇2:
import __builtin__
def sorted(services):
return __builtin__.sorted(services, key=lambda s: s.sortkey())
的Python 3:
import builtins
def sorted(services):
return builtins.sorted(services, key=lambda s: s.sortkey())