Python имя вызванной функции

Python, как получить вызывающую функцию (а не только ее имя)?

Я хочу написать функцию, которая возвращает вызывающую функцию:

def foo(): return get_calling_function() #should return 'foo' function object 

Там много примеров онлайн, как получить имя вызывающей функции, но не как получить фактический объект. Я придумал следующее решение, которое получает имя, а затем просматривает его в глобальном пространстве имен вызывающей функции. Однако это не работает для функций класса, так как там вам также нужно имя класса, и я также вижу там множество других случаев.

from inspect import stack def get_calling_function(): return stack()[2][0].f_globals[stack()[1][3]] 

Итак, любой совет, как или если его можно написать эту функцию, чтобы она работала в целом (на Python 3, btw)? Благодарю.

Вызов может происходить из любого объекта кода (и из модуля расширения/встроенного): от exec , execfile , из пространства имен модулей (во время импорта), из определения класса, из метода /classmethod/staticmethod, из декорированной функции /method, изнутри вложенной функции… – так что в общем случае нет “вызывающей функции”, и трудно сделать что-то хорошее с этим.

Фреймы стека и их объекты кода являются наиболее общими, которые вы можете получить – и изучите атрибуты.

Во многих случаях это вызывает функцию вызова:

import sys, inspect def get_calling_function(): """finds the calling function in many decent cases.""" fr = sys._getframe(1) # inspect.stack()[1][0] co = fr.f_code for get in ( lambda:fr.f_globals[co.co_name], lambda:getattr(fr.f_locals['self'], co.co_name), lambda:getattr(fr.f_locals['cls'], co.co_name), lambda:fr.f_back.f_locals[co.co_name], # nested lambda:fr.f_back.f_locals['func'], # decorators lambda:fr.f_back.f_locals['meth'], lambda:fr.f_back.f_locals['f'], ): try: func = get() except (KeyError, AttributeError): pass else: if func.__code__ == co: return func raise AttributeError("func not found") # Usage def f(): def nested_func(): print get_calling_function() print get_calling_function() nested_func() class Y: def meth(self, a, b=10, c=11): print get_calling_function() class Z: def methz(self): print get_calling_function() z = Z() z.methz() return z @classmethod def clsmeth(cls): print get_calling_function() @staticmethod def staticmeth(): print get_calling_function() f() y = Y() z = y.meth(7) z.methz() y.clsmeth() ##y.staticmeth() # would fail 

Источник

Имя функции в Python: как его получить?

Имя функции в Python: как его получить?

В Python имя функции, как и все остальные объекты, обладает свойствами, доступ к которым можно получить при помощи встроенных функций и методов. В статье мы подробно рассмотрим разные способы определения имени функции.

Использование свойства __name__

В Python каждая функция обладает рядом свойств, которые доступны через специальные имена, начинающиеся и заканчивающиеся двумя подчеркиваниями. Одно из таких свойств — __name__ , которое содержит имя функции.

def my_function(): pass print(my_function.__name__) #my_function

В этом примере my_function.__name__ вернул строку my_function , которая является именем функции.

Читайте также:  How to check internet connection android java

Использование модуля inspect

Модуль inspect в стандартной библиотеке Python предоставляет несколько функций для получения информации о функциях и других объектах. Одной из таких функций является inspect.getsource() , которая возвращает исходный код функции в виде строки.

import inspect def my_function(): pass def get_name(func): lines = inspect.getsource(func).splitlines() first_line = lines[0] name = first_line.split()[1].split('(')[0] return name print(get_name(my_function)) #my_function

В этом примере get_name() использует inspect.getsource() для получения исходного кода функции, затем извлекает первую строку этого кода и извлекает имя функции из этой строки.

Заключение

В Python есть несколько способов определить имя функции. Самый простой и прямой способ — использовать свойство __name__ функции. Наконец, можно использовать модуль inspect из стандартной библиотеки Python для извлечения исходного кода функции и поиска ее имени в этом коде.

4 способа добавления элементов в словарь Python

4 способа добавления элементов в словарь Python

Как легко сортировать словарь по ключам в Python: ТОП методы и примеры

Как легко сортировать словарь по ключам в Python: ТОП методы и примеры

Добавление элементов одного списка в другой с помощью метода extend() в Python

Добавление элементов одного списка в другой с помощью метода extend() в Python

Менеджер пакетов pip в Python: что это, как с ним работать + основные команды

Менеджер пакетов pip в Python: что это, как с ним работать + основные команды

F-строки в Python: как работают, способы форматирования и множество примеров

F-строки в Python: как работают, способы форматирования и множество примеров

Методы и способы поиска элемента в списке в Python

Методы и способы поиска элемента в списке в Python

Источник

Как получить имя функции в виде строки в Python?

должен выводить «my_function» . Доступна ли такая функция в Python? Если нет, какие-либо идеи о том, как реализовать get_function_name_as_string , в Python?

В следующий раз, пожалуйста, укажите вашу мотивацию в вопросе. В своей нынешней форме он, очевидно, сбивает людей с толку, и некоторые из них склонны считать, что вы будете вызывать дословно get_function_name_as_string(my_function) и ожидаете в результате «my_function» . Я предполагаю, что ваша мотивация — это общий код, который работает с функцией как первоклассным объектом и должен получить имя функции, переданной в качестве аргумента.

Мотивация вопроса не имеет отношения к техническому ответу. Прекратите использовать его как оправдание для насмешек, критики, интеллектуального позирования и избегания ответов.

Мотивация может помочь решить, будет ли задан правильный вопрос. В этом примере пользователь уже четко знает имя функции, поэтому использовать другую функцию для его возврата? Почему бы просто не сделать что-то столь же простое, как print(«my_function») ? Ответ на это в мотивации.

Читайте также:  Add Record Form

@Dannid, это скучный аргумент. Если OP запрашивает имя функции, это потому, что она инкапсулирована или понята способом, который должен быть выведен, например, для целей отладки. Ручная настройка в среде, где требуется такое требование, является ужасной практикой программирования. У вас может быть список функций для вызова, или вам может быть передана функция и вы хотите записать имя функции. И еще миллион причин, кроме просто для развлечения / изучения Python, которого, если хотите, уже достаточно.

Перечитывая мой комментарий, я не уверен, почему я перешел на сторону желания мотивации в ОП. Мотивация должна быть неактуальной. Похоже, я играл адвоката бедного дьявола. Я полагаю, что я чувствовал и не очень хорошо общался, потому что это помогает узнать, какова цель функции — вы отлаживаете? Написание шаблона функции? Создание динамических глобальных переменных? Это одноразовая или постоянная функция, которую вы будете часто использовать? В любом случае, я должен был согласиться с тем, что мотивация не имеет отношения к техническому ответу, хотя это может помочь решить, какой технический ответ лучше.

Источник

Имена текущих функции (метода), класса, объекта

Возможно ли в Python при выполнении программы узнать имена выполняющейся в данный момент функции (метода), если это метод класса — имя этого класса, и, желательно, объекта этого класса.

Обрыв функции при вызове метода из объекта другого класса
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp.

Вызов метода класса из сторонней функции без объявления объекта
Собственно вопрос в топике. Можно? т.е. есть некий класс MyMySQLClass() в котором прописаны.

Работа метода класса в зависимости от типа объекта класса
есть такой код: template <typename __Type, size_t __m> class mvector < private: .

Как вывести имена текущих подключившихся компьютеров к бд
Нашел в майкрософте код, который выводит на печать имена компьютеров, которые в данный момент.

На басурманском сайте еще такое нашел, тоже работает:

print ("My name is: %s" % inspect.stack()[0][3])

Эксперт Python

А зачем?
Такое может понадобиться только для отладки. Ну так воспользуйтесь цивильным отладчиком. PyCharm ждёт вас.

ЦитатаСообщение от dondublon Посмотреть сообщение

Почему же, совсем не обязательно. Самым банальным примером может служить библиотека flask-classy, она строит url на основе названия классов и названий методов и активно использует такие вещи.

Эксперт Python

ЦитатаСообщение от alex925 Посмотреть сообщение

Почему же, совсем не обязательно. Самым банальным примером может служить библиотека flask-classy, она строит url на основе названия классов и названий методов и активно использует такие вещи.

Читайте также:  Метод math abs java

Не работал с flask-classy, но сильно сомневаюсь.

Речь была про то, чтобы узнать выполняющийся вот прям щас метод. Где мы сейчас, в идущем процессе. Смотрим на метод изнутри.

Строить url на основе названий классов — это совсем другое. Для этого даже объект класса создавать не нужно, и тем более — его запускать. Смотрим на методы извне.

ЦитатаСообщение от dondublon Посмотреть сообщение

ЦитатаСообщение от dondublon Посмотреть сообщение

Ну да, согласен, это немного другой разговор, но все равно не думаю, что это задача уж больно экзотическая.

ЦитатаСообщение от dondublon Посмотреть сообщение

Есть необходимость организовать в программе логирование. Программа разделена, условно говоря, на интерфейсную и рабочую части (не MVC, скорее в ней вид объединен с контроллером в одном модуле, а модель — в нескольких других модулях).

В ходе не отладки, а рабочей эксплуатации программы могут возникать внештатные ситуации, инфа о которых будет сбрасываться в логи. Ну и хотелось бы знать, из какой именно функции модели пришла очередная запись в лог, чтобы лучше понимать, что случилось.

import traceback try: raise TypeError("Oups!") except Exception as err: tb = traceback.format_exc() print(tb)

В стандартном трейсе есть все, от описания ошибки, до указания на место возникновения. В реальном приложении конечно надо обработку похитрей делать, но способ все равно хороший.

Эксперт Python

Вызов метода объекта класса
Как вызвать метод объекта класса ? заголовочный файл********** #include <vector>.

Узнать все метода объекта класса
Можно ли вывести все методы объекта класса типа как get_defined_functions()?

Создание объекта класса и вызов его метода
Добрый день, форумчане. На Яве программирую не больше недели. Столкнулся со следующей проблемой.

Вызов метода объекта внутри определения метода другого объекта(вложенные классы)
Как мне вызвать метод объекта slider класса Slider внутри определения метода объекта класса.

Вывод результата работы метода объекта класса на экран
Здравствуйте, препод дал задание создать класс и реализовать внешний метод с помощью объекта.

Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса
Здравствуйте. Помогите грамотно передать в лямбду метод класса. Упрощенно. Есть класс. В одном.

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса .

Источник

Оцените статью