当函数在python中返回自己的名字时会发生什么?

时间:2014-08-08 13:40:51

标签: python

def traceit(frame, event, trace_arg):
    global stepping

    if event == 'line':
        if stepping or frame.f_lineno in breakpoints:
            resume = False
            while not resume:
                print(event, frame.f_lineno, frame.f_code.co_name, frame.f_locals)
                command = input_command()
                resume = debug(command, frame.f_locals)
    return traceit

代码中最后一行的含义是什么?

编辑:

def remove_html_markup(s):
    tag   = False
    quote = False
    out   = ""

    for c in s:
        if c == '<' and not quote:
            tag = True
        elif c == '>' and not quote:
            tag = False
        elif c == '"' or c == "'" and tag:
            quote = not quote
        elif not tag:
            out = out + c
    return out

def main():
    print (remove_html_markup('xyz'))
    print (remove_html_markup('"<b>foo</b>"'))
    print (remove_html_markup("'<b>foo</b>'"))

# globals
breakpoints = {9: True}
stepping = False

def debug(command, my_locals):
    global stepping
    global breakpoints

    if command.find(' ') > 0:
        arg = command.split(' ')[1]
    else:
        arg = None

    if command.startswith('s'):     # step
        stepping = True
        return True
    elif command.startswith('c'):   # continue
        stepping = False
        return True
    elif command.startswith('q'):   # quit
        sys.exit(0)
    else:
        print ("No such command", repr(command))

    return False

commands = ['s', 's', 's', 'q']

def input_command():
    #command = raw_input("(my-spyder) ")
    global commands
    command = commands.pop(0)
    return command

def traceit(frame, event, trace_arg):
    global stepping

    if event == 'line':
        if stepping or frame.f_lineno in breakpoints:
            resume = False
            while not resume:
                print(event, frame.f_lineno, frame.f_code.co_name, frame.f_locals)
                command = input_command()
                resume = debug(command, frame.f_locals)
    return traceit

# Using the tracer
sys.settrace(traceit)
main()
sys.settrace(None)

4 个答案:

答案 0 :(得分:17)

函数是一个像其他任何人一样的对象,所以返回它本身没有问题。例如,它允许在同一行重复调用:

traceit("abc", "def", None)("ghi", "jkl", 3)("mno", "pqr", 4.3)

编辑:sys.settrace设置全局跟踪函数,每次输入本地作用域以调用本地跟踪函数时都会调用该函数。这里它返回自己,以处理同一函数中的所有跟踪。

有关详细信息,请参阅https://docs.python.org/2/library/sys.html#sys.settrace

答案 1 :(得分:10)

由于Python中的所有函数都是作为对象创建的,因此它返回对函数的引用。

它可以在代码中稍后传递给另一个函数,或者使用参数调用,就像使用任何函数一样。

def a(str):
    print str
b = a # Assign an instance of a to b
b('hello') # Call b as if it were a

print type(b)

打印:

hello
<type 'function'>

答案 2 :(得分:7)

https://docs.python.org/2/library/sys.html#sys.settrace

settrace允许您传递函数以用作调试器。 每次输入新范围时,都会调用您传递的函数。它需要返回一个应该用于在该范围内进行调试的函数。

由于该代码的编写者希望始终使用相同的函数,因此该函数将自行返回。

链接中的相关位:

  

每当a调用跟踪功能(事件设置为&#39; call&#39;)   输入新的本地范围; 它应该返回对本地的引用   要使用范围的跟踪函数,如果范围不应该使用无   被追查。

     

本地跟踪功能应该返回对自身的引用(或者   另一个用于在该范围内进一步追踪的功能),或无转弯   在该范围内追踪。

答案 3 :(得分:3)

它返回一个函数对象。我很好奇你是否在实时代码中找到了这个以及用例可能是什么。