LINUX.ORG.RU

питон, можно ли узнать имя функции, вызвавшей текущую функцию?

 


1

1

Если допустим функция A вызывает функцию B, можно ли внутри B узнать кто её вызвал?

Или определить рекурсию, когда B вызывает сама себя, чтобы предотвратить зацикливание.

Пока на уме парсить трейсбек, но может есть способы цивильнее?

import inspect

Там есть уже распарсенный стек вызовов.

Как-то так: inspect.stack()[2][3]

E ★★★
()
Ответ на: комментарий от E

спасибо
а имя функции по ходу вообще не узнать, только получить адрес фрейма из inspect.currentFrame() и сравнить с адресом в стеке?

sergey-novikov ★★★
() автор топика

Естественно, сделать такое без костылей можно только в нормальном языке. Например, в JS


function f(){w(arguments.callee.caller)}
function helper(f){f()}

helper(f)

//>>>> [Function: helper]

anonymous
()
Ответ на: комментарий от sergey-novikov

Ты на inspect.stack() смотрел вообще? Там имена функций есть, в том числе и текущей.

Virtuos86 ★★★★★
()

Или определить рекурсию, когда B вызывает сама себя, чтобы предотвратить зацикливание.

def func(val):
    try:
        print ('IN', val)

        if getattr(func, '_used', False):
            raise Exception('Recursive call')

        func._used = True

        func(val + 1)

    finally:
        func._used = False
mashina ★★★★★
()

Если допустим функция A вызывает функцию B, можно ли внутри B узнать кто её вызвал?

а можно узнать, зачем?

emulek
()

Эм, inspect, но его использование считается антипаттерном. В частности по тому что он

1) не гарантирует обратной совместимости

2) может работать по-другому в других реализациях python (например, pypy)

3) можно легко всандалить очень сложные для отладки баги

Я думаю, разумнее редизайнить твоё приложение. Кстати, а что ты делаешь?

true_admin ★★★★★
()
Ответ на: комментарий от emulek

Динамические петушки любят подобным заниматься вместо работы.

anonymous
()
Ответ на: комментарий от emulek

В питоне не знаю, а вот в JS пригождается иногда


function tuk_tuk(){if(arguments.callee.caller.name==="Emulek") return console.log("Welcome, bro!!!"); console.log("Fuck off fuckin' fug")}
function static_whore_anon(f){f()}
function Emulek(f){f()}

static_whore_anon(tuk_tuk)
Emulek(tuk_tuk)



//>>>> Fuck off fuckin' fug
//>>>> Welcome, bro!!!

anonymous
()

Или определить рекурсию, когда B вызывает сама себя, чтобы предотвратить зацикливание.

Питон не зацикливается на рекурсии, если ты не трогаешь sys.setrecursionlimit.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

Добавьте, пожалуйста, в Яндекс.Стор какой-нибудь IRC-клиент.

Deathstalker ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.