Подтвердить что ты не робот

Что происходит, когда функция возвращает свое собственное имя в 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

В чем смысл последней строки в коде?

EDIT:

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)
4b9b3361

Ответ 1

Функция - это объект, как и любой другой, поэтому нет проблемы с возвратом. Например, он позволяет повторять вызов в одной строке:

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

Изменить: sys.settrace задает функцию глобальной трассировки, которая вызывается каждый раз, когда локальная область вводится для запроса локальной функции трассировки. Здесь он возвращает себя, чтобы обрабатывать все трассировки в одной и той же функции.

Подробнее см. https://docs.python.org/2/library/sys.html#sys.settrace.

Ответ 2

Поскольку все функции в 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'>

Ответ 3

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

settrace позволяет передавать функцию, используемую в качестве отладчика. Каждый раз, когда вводится новая область, вызывается вызываемая вами функция. Он должен вернуть функцию, которая должна использоваться для отладки внутри этой области.

Поскольку писатель этого кода хотел всегда использовать одну и ту же функцию, функция возвращает себя.

Соответствующий бит по ссылке:

Вызывается функция трассировки (с событием, установленным на "вызов" ), когда вводится новая локальная область; он должен вернуть ссылку на локальный функция трассировки, которая будет использоваться в области, или None, если область действия не должна прослеживается.

Локальная функция трассировки должна возвращать ссылку на себя (или другая функция для дальнейшей трассировки в этой области), или Нет, чтобы включить отключение трассировки в этой области.

Ответ 4

Возвращает объект функции. Мне интересно, если вы нашли это в живом коде и в каком случае может быть.