2024-10-01 09:38:54 发布
网友
我可以从同名函数调用全局函数吗
例如:
def sorted(services): return {sorted}(services, key=lambda s: s.sortkey())
我所说的{sorted}是指全局排序函数。 有办法做到这一点吗? 然后我想用模块名调用我的函数:service.sorted(services)
{sorted}
service.sorted(services)
我希望使用相同的名称,因为它与全局函数的作用相同,只是添加了一个默认参数
Python的名称解析方案有时被称为LEGB规则,这意味着当在函数中使用非限定名称时,Python最多搜索四个作用域-首先搜索局部(L)作用域,然后搜索任何封闭(E)def和lambda的局部作用域,然后搜索全局(G)作用域,最后是内置(B)范围。(请注意,它将在找到匹配项后立即停止搜索)
LEGB
def
lambda
因此,当您在函数内部使用sorted时,解释器将其视为一个全局名称(您的函数名称),因此您将拥有一个递归函数。如果您想访问内置的sorted,您需要为Python指定它。通过__builtin__模块(在Python-2.x中)和^{}在Python-3.x中(此模块提供对Python的所有“内置”标识符的直接访问)
sorted
__builtin__
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)访问该函数:
但是,不建议使用这两种阴影内置功能。如果可能,请选择其他名称
Python的名称解析方案有时被称为
LEGB
规则,这意味着当在函数中使用非限定名称时,Python最多搜索四个作用域-首先搜索局部(L)作用域,然后搜索任何封闭(E)def
和lambda
的局部作用域,然后搜索全局(G)作用域,最后是内置(B)范围。(请注意,它将在找到匹配项后立即停止搜索)因此,当您在函数内部使用} 在Python-3.x中(此模块提供对Python的所有“内置”标识符的直接访问)
sorted
时,解释器将其视为一个全局名称(您的函数名称),因此您将拥有一个递归函数。如果您想访问内置的sorted
,您需要为Python指定它。通过__builtin__
模块(在Python-2.x中)和^{python 2:
python 3:
在定义具有相同名称的新函数之前,存储原始函数引用
对于^{} 之类的内置函数,可以使用^{} module (在Python 3.x中,^{} module )访问该函数:
但是,不建议使用这两种阴影内置功能。如果可能,请选择其他名称
相关问题 更多 >
编程相关推荐