Что происходит, когда функция возвращает свое собственное имя в 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)
Ответы
Ответ 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
Возвращает объект функции. Мне интересно, если вы нашли это в живом коде и в каком случае может быть.