import inspect
def b(*args):
a()
def c():
pass
a()
def a(*args):
res = inspect.getouterframes(inspect.currentframe())[1].function
context = inspect.stack()[2].code_context[0]
if res != '<module>' and 'a' in context:
print(f'executed in {res}')
a()
b(a())
c()
# executed in b
Т.е. по сути мы проверяем есть ли строка 'a' в строке 'b(a())'? А есть ли какой-то еще способ? Может можно как-то сравнивать id объектов? Т.к. например такой код уже не сработает:
Хмм, думаю можно будет воспользоваться tokenize или ast чтобы определить имя функции и факт вызова в context, а затем получить объекты этих функций по именам из фреймов и сравнить id...