python函数能否使用相同的名称调用全局函数?

2024-10-01 09:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以从同名函数调用全局函数吗

例如:

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

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

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


Tags: 模块lambdakey函数名称return排序def
2条回答

Python的名称解析方案有时被称为LEGB规则,这意味着当在函数中使用非限定名称时,Python最多搜索四个作用域-首先搜索局部(L)作用域,然后搜索任何封闭(E)deflambda的局部作用域,然后搜索全局(G)作用域,最后是内置(B)范围。(请注意,它将在找到匹配项后立即停止搜索)

因此,当您在函数内部使用sorted时,解释器将其视为一个全局名称(您的函数名称),因此您将拥有一个递归函数。如果您想访问内置的sorted,您需要为Python指定它。通过__builtin__模块(在Python-2.x中)和^{}在Python-3.x中(此模块提供对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())

在定义具有相同名称的新函数之前,存储原始函数引用

original_sorted = sorted

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

对于^{}之类的内置函数,可以使用^{} module(在Python 3.x中,^{} module)访问该函数:

import __builtin__

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

但是,不建议使用这两种阴影内置功能。如果可能,请选择其他名称

相关问题 更多 >