Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python函数能否使用相同的名称调用全局函数?_Python_Python 3.x_Function_Namespaces_Python Internals - Fatal编程技术网

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

python函数能否使用相同的名称调用全局函数?,python,python-3.x,function,namespaces,python-internals,Python,Python 3.x,Function,Namespaces,Python Internals,我可以从同名函数调用全局函数吗 例如: def sorted(services): return {sorted}(services, key=lambda s: s.sortkey()) 通过{sorted}我指的是全局排序函数。 有办法做到这一点吗? 然后我想用模块名调用我的函数:service.sorted(services) 我想使用相同的名称,因为它与全局函数的作用相同,只是它添加了一个默认参数。在定义具有相同名称的新函数之前存储原始函数引用 original_sorted

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

例如:

def sorted(services):
    return {sorted}(services, key=lambda s: s.sortkey())
通过
{sorted}
我指的是全局排序函数。 有办法做到这一点吗? 然后我想用模块名调用我的函数:
service.sorted(services)


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

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

original_sorted = sorted

def sorted(services):
    return original_sorted(services, key=lambda s: s.sortkey())
对于内置函数,如,可以使用(在Python 3.x中,)访问该函数:


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

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

因此,当您在函数中使用
sorted
时,解释器将其视为全局名称(您的函数名称),因此您将拥有一个递归函数。如果要访问内置的
sorted
,需要为Python指定它。通过
\uuuu内置的
模块(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())

你能不能只写你想写的代码,运行它,如果它失败了,告诉我们错误消息是什么?当然你可以访问
\uuuuuuuuuuuuuu内置的排序的
,但是你所做的听起来像是一个糟糕的计划。只是不要把你的函数命名为内置的。问题解决了。如果该函数不在类中,则它本身就是一个全局函数。如果它在一个类中,调用
sorted
而不是
self.sorted
cls.sorted
就可以了。使用外部来源的内容时,您应该添加适当的属性:@AshwiniChaudhary是的,您是对的,但是当我在几个月前读到这篇文章时,我记不太清楚了,我只是复制了第一部分,并且在其中添加了一些额外的单词,我认为没有必要给出来源。换句话说,我的意思是,我知道主要的概念,没有必要添加参考,但无论如何,我认为你是对的,谢谢你提醒我,内置正是我想要的。无论这是不是一个坏主意,我都会从经验中发现。原来的排序对我不起作用。我在Python3.x中的一个模块中执行此操作。我得到这个错误:AttributeError:'builtin_function_或_method'对象没有属性'sorted'@user13097,你能提供你的运行源吗?关于
\uuuuuuuuuuuu
/
内置方法如何?@user13097,请参阅使用
原始方法的演示:
import builtins
def sorted(services):
    return builtins.sorted(services, key=lambda s: s.sortkey())