我可以从具有相同名称的函数调用全局函数吗?
例如:
def sorted(services):
return {sorted}(services, key=lambda s: s.sortkey())
按{sorted}
我的意思是全局排序函数。
有没有办法做到这一点?
然后我想用模块名称调用我的函数:service.sorted(services)
我想使用相同的名称,因为它与全局函数的作用相同,只是它添加了一个默认参数。
答案 0 :(得分:5)
在定义具有相同名称的新功能之前,存储原始功能参考。
original_sorted = sorted
def sorted(services):
return original_sorted(services, key=lambda s: s.sortkey())
对于像sorted
这样的内置函数,您可以使用__builtin__
module(在Python 3.x中,builtins
module)访问该函数:
import __builtin__
def sorted(services):
return __builtin__.sorted(services, key=lambda s: s.sortkey())
但是,不推荐使用哪个shadow builtin功能。如果可能,请选择其他名称。
答案 1 :(得分:5)
Python的名称解析方案(有时称为LEGB
规则)意味着当您在函数中使用非限定名称时,Python会搜索最多四个范围 - First 本地(L)范围,然后是任何封闭(E)def
和lambda
的本地范围,然后是全局(G)范围,最后是内置(B)范围。 (请注意,它会在找到匹配后立即停止搜索)
因此,当您在函数内使用sorted
时,解释器会将其视为全局名称(您的函数名称),因此您将拥有递归函数。如果要访问内置sorted
,则需要为Python指定。通过__builtin__
模块(Python-2.x 中的)和Python-3.x中的builtins
(此模块提供对Python的所有“内置”标识符的直接访问)
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())