Python: Как получить имя метода вызывающего в вызываемом методе?

Python: Как получить имя метода вызывающего в вызываемом методе?

Предположим, у меня есть 2 метода:

def method1(self): ... a = A.method2() def method2(self): ... 

Если я не хочу делать какие-либо изменения для метода1, как получить имя вызывающего (в этом примере имя метода method1) в методе2?

  • Может ли Python определять класс объекта, обращающегося к методу
  • Объект вызова Introspect
  • Функциональное API Keras альтернативное решение для pred_classes ()
  • Пирамида: Пользовательская страница 404 возвращается как «200 OK»
  • Раунд до ближайшего 500, Python
  • Как разобрать отступы и разделители с помощью pyparsing?
  • Как я могу получить бутылку для перезагрузки при смене файла?
  • Использование урожая с пониманием dict
  • 6 Solutions collect form web for “Python: Как получить имя метода вызывающего в вызываемом методе?”

    inspect.getframeinfo и другие связанные функции в inspect могут помочь:

     >>> import inspect >>> def f1(): f2() ... >>> def f2(): ... curframe = inspect.currentframe() ... calframe = inspect.getouterframes(curframe, 2) ... print 'caller name:', calframe[1][3] ... >>> f1() caller name: f1 >>> 

    эта интроспекция предназначена для помощи в отладке и разработке; нецелесообразно полагаться на это для производственных целей.

    Более короткая версия:

     import inspect def f1(): f2() def f2(): print 'caller name:', inspect.stack()[1][3] f1() 

    (благодаря @Alex и Stefaan Lippen )

    Кажется, это работает очень хорошо:

     import sys print sys._getframe().f_back.f_code.co_name 

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

    https://gist.github.com/2151727 (rev 9cccbf)

     # Public Domain, ie feel free to copy/paste # Considered a hack in Python 2 import inspect def caller_name(skip=2): """Get a name of a caller in the format module.class.method `skip` specifies how many levels of stack to skip while getting caller name. skip=1 means "who calls me", skip=2 "who calls my caller" etc. An empty string is returned if skipped levels exceed stack height """ stack = inspect.stack() start = 0 + skip if len(stack) < start + 1: return '' parentframe = stack[start][0] name = [] module = inspect.getmodule(parentframe) # `modname` can be None when frame is executed directly in console # TODO(techtonik): consider using __main__ if module: name.append(module.__name__) # detect classname if 'self' in parentframe.f_locals: # I don't know any way to detect call from the object method # XXX: there seems to be no way to detect static method call - it will # be just a function call name.append(parentframe.f_locals['self'].__class__.__name__) codename = parentframe.f_code.co_name if codename != '<module>': # top level usually name.append( codename ) # function or a method ## Avoid circular refs and frame leaks # https://docs.python.org/2.7/library/inspect.html#the-interpreter-stack del parentframe, stack return ".".join(name) 

    Немного об объединении вещей выше. Но вот моя трещина.

     def print_caller_name(stack_size=3): def wrapper(fn): def inner(*args, **kwargs): import inspect stack = inspect.stack() modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, stack_size))] module_name_lengths = [len(module.__name__) for _, module in modules] s = '{index:>5} : {module:^%i} : {name}' % (max(module_name_lengths) + 4) callers = ['', s.format(index='level', module='module', name='name'), '-' * 50] for index, module in modules: callers.append(s.format(index=index, module=module.__name__, name=stack[index][3])) callers.append(s.format(index=0, module=fn.__module__, name=fn.__name__)) callers.append('') print('\n'.join(callers)) fn(*args, **kwargs) return inner return wrapper 

    Использование:

     @print_caller_name(4) def foo(): return 'foobar' def bar(): return foo() def baz(): return bar() def fizz(): return baz() fizz() 

    выход

     level : module : name -------------------------------------------------- 3 : None : fizz 2 : None : baz 1 : None : bar 0 : __main__ : foo 

    Я нашел способ, если вы проходите классы и хотите, чтобы класс принадлежал методу AND. Это требует немного работы по извлечению, но это делает ее точкой. Это работает в Python 2.7.13.

     import inspect, os class ClassOne: def method1(self): classtwoObj.method2() class ClassTwo: def method2(self): curframe = inspect.currentframe() calframe = inspect.getouterframes(curframe, 4) print '\nI was called from', calframe[1][3], \ 'in', calframe[1][4][0][6: -2] # create objects to access class methods classoneObj = ClassOne() classtwoObj = ClassTwo() # start the program os.system('cls') classoneObj.method1() 
    Interesting Posts

    Есть ли способ скопировать только структуру (а не данные) Pandas DataFrame?

    Каков официальный способ хранения настроек для программ python?

    Вызов функций AutoIt в Python

    Использование LabelEncoder Scikit правильно в нескольких программах

    Как определить время обработки в Python?

    Удаление дубликатов с использованием только лямбда-функций

    Как сгладить список кортежей в список pythonic

    Почему -1/2 оценивается как 0 в C ++, но -1 в Python?

    Python xlrd: подавлять предупреждающие сообщения

    Может реплицировать пакеты пакетов из требований. Txt

    Как вы включаете код фляжки / jinja2 внутри файла уценки?

    Что такое кросс-платформенный способ воспроизведения звукового файла в python?

    Визуализация статистики данных Mongodb с использованием matplotlib

    Сгенерируйте тепловую карту в MatPlotLib, используя набор данных рассеяния

    освобождение памяти для объектов, возвращаемых на python через ctypes

    Python - лучший язык программирования в мире.