python函数可以调用具有相同名称的全局函数吗?

时间:2014-12-26 13:53:39

标签: python function module namespaces python-internals

我可以从具有相同名称的函数调用全局函数吗?

例如:

def sorted(services):
    return {sorted}(services, key=lambda s: s.sortkey())

{sorted}我的意思是全局排序函数。 有没有办法做到这一点? 然后我想用模块名称调用我的函数:service.sorted(services)

我想使用相同的名称,因为它与全局函数的作用相同,只是它添加了一个默认参数。

2 个答案:

答案 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)deflambda的本地范围,然后是全局(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())