Python получить имя функции внутри функции

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

Состав задачи, заданный объект функции, назначенного имени. Как получить имя функции как строку? Например, рассмотрим следующую функцию your_function. Как получить название «your_function» от этого? def your_function (): пройти string_name = . Ваше желаемое значение результата, хранящегося в String_Name, является строкой «your_function». … Как получить имя функции как строку в Python? Подробнее “

Постановка проблемы

Учитывая функциональный объект, назначенный на имя. Как получить имя функции как строку?

Например, рассмотрим следующую функцию your_function Отказ Как получить имя «your_function» из этого?

def your_function(): pass string_name = .

Ваше желаемое значение результата хранится в string_name это строка «your_function» Отказ

print(string_name) # your_function

Метод 1: Используйте атрибут __name__

Самый питонический способ извлечения имени от любого объекта или класса – использовать его __name__ атрибут. Атрибуты, заключенные в двойной подчеркивании (атрибуты Dunder), предоставляют специальные функциональные возможности для программистов Python. Например, звонок your_function .__ Имя__ дает строковое значение ‘your_function’ Отказ

def your_function(): pass string_name = your_function.__name__ print(string_name) # your_function

Тем не менее, есть важный случай, когда этот метод потерпит неудачу.

💣 Внимание : В Python функции являются объектами. Вы можете создавать несколько переменных, указывающих на тот же объект в памяти. Поэтому вы можете создать два имени func_1 и func_2 Это оба указывают на один и тот же объект функции. При звонке func_1 .__ name__ Результат может быть func_2 вместо func_1 что ты ожидал.

Читайте также:  Php function на загрузку файла

Это демонстрируется в следующем минимальном примере:

def func_2(): pass func_1 = func_2 print(func_1.__name__) # func_2

Как оба имена указывают на тот же объект памяти, но func_2 Во-первых, указывал на это имя объекта func_2 Отказ Использование памяти этого кода визуализируется с помощью инструмента Python Reputor:

Обе переменные относятся к тому же объекту функции, которые по умолчанию как func_2 имя.

Метод 2: Используйте атрибут __qualname__

Чтобы извлечь имя из любого объекта или класса, вы также можете использовать его __qualname__ атрибут. Например, звонок your_function .__ Qualname__ дает строковое значение ‘your_function’ Отказ Вы бы использовали __qualname__ над __имя__ Если вам также понадобится какой-то контекст, такой как класс, определяющий метод.

Следующий код создает функцию и способ внутри класса. Затем он сравнивает вывод __name__ и __qualname__ Атрибуты как функции, так и класса:

def my_function(): pass class My_Class(object): def my_method(self): pass print(my_function.__name__) # "my_function" print(My_Class.my_method.__name__) # "my_method" print(my_function.__qualname__) # "my_function" print(My_Class.my_method.__qualname__) # "My_Class.my_method"

Вы можете погрузиться глубже в идиосинкразиях __qualname__ здесь и здесь Отказ

Спасибо за прочтение этой статьи. Чтобы повысить свои навыки Python, подумайте о том, чтобы присоединиться к бесплатной академии электронной почты Finxter с большим количеством чит-листов, учебников Python и забиты забавных программиров! 🙂

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

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

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

Читайте ещё по теме:

Источник

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

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

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

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

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

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

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

Источник

Как напечатать имя метода / функции с использованием системной переменной Python 3.6 [duplicate]

Python не имеет функции доступа к функции или ее имени внутри самой функции. Было предложено , но отклонено. Если вы не хотите играть со стеком самостоятельно, вы должны либо использовать «bar» , либо bar.__name__ в зависимости от контекста.

Данное уведомление об отказе:

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

Объединение подхода @ CamHart с @ Yuval’s избегает & quot; hidden & quot; и, возможно, устаревшие методы в ответе @ RoshOxymoron, а также численное индексирование в стек для ответа @ neuro / @ AndreasJung: print(inspect.currentframe().f_code.co_name) – hobs 17 March 2015 в 22:43

Я думаю, inspect — лучший способ сделать это. Пример:

import inspect def bar(): print "My name is", inspect.stack()[0][3] 

Я нашел обертку, которая будет писать имя функции

from functools import wraps def tmp_wrap(func): @wraps(func) def tmp(*args, **kwargs): print func.__name__ return func(*args, **kwargs) return tmp @tmp_wrap def my_funky_name(): print "STUB" my_funky_name() 

Как декоратор noob, мне интересно, есть ли способ получить доступ к func .__ name__ в контексте my_funky_name (чтобы я мог получить его значение и использовать его внутри my_funky_name) – cowbert 29 June 2017 в 21:57

Способ сделать это внутри функции my_funky_name — my_funky_name.__name__ . Вы можете передать func .__ name__ в функцию как новый параметр. func (* args, ** kwargs, my_name = func .__ name__). Чтобы получить имя вашего декоратора изнутри вашей функции, я думаю, что это потребует использования проверки. Но получить имя функции, управляющей моей функцией, в моей текущей функции . ну, это просто похоже на начало красивого мема 🙂 – cad106uk 2 July 2017 в 13:00

Я сделал то, что сказал CamHart:

import sys def myFunctionsHere(): print(sys._getframe().f_code.co_name) myFunctionsHere() 

C: \ Python \ Python36 \ python.exe C: / Python / GetFunctionsNames / TestFunctionsNames. py myFunctionsHere

Процесс завершен кодом выхода 0

functionNameAsString = sys._getframe().f_code.co_name 

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

Полностью работая, просто используя sys, не нужно загружать больше модулей, но не так легко запомнить: V – erm3nda 13 June 2016 в 20:29

Объединение предложений @ CamHart и @ Yuval с принятым ответом @ RoshOxymoron имеет преимущество:

  • _hidden и потенциально устаревшие методы
  • индексирования в стек (который может быть переупорядочен в будущих питонах)

Поэтому я думаю, что это хорошо сочетается с будущими версиями python (проверены на 2.7.3 и 3.3.2):

from __future__ import print_function import inspect def bar(): print("my name is '<>'".format(inspect.currentframe().f_code.co_name)) 

Такая же ситуация, как с .func_name . Стоит помнить, что имена классов и имена функций в Python — это одно, а переменные, относящиеся к ним, — это другое. – Kos 13 December 2012 в 13:48

Иногда вам может потребоваться Foo2() для печати Foo . Например: Foo2 = function_dict[‘Foo’]; Foo2() . В этом случае Foo2 является указателем на функцию, возможно, для синтаксического анализа командной строки. – Harvey 1 June 2013 в 21:02

Скорейшее значение в отношении чего? Есть ли ситуация, когда вам нужно будет иметь эту информацию в сложной ситуации в реальном времени или что-то в этом роде? – bgporter 23 February 2014 в 17:27

Вы можете использовать декоратор:

def my_function(name=None): return name def get_function_name(function): return function(name=function.__name__) >>> get_function_name(my_function) 'my_function' 

Есть несколько способов получить один и тот же результат:

from __future__ import print_function import sys import inspect def what_is_my_name(): print(inspect.stack()[0][0].f_code.co_name) print(inspect.stack()[0][3]) print(inspect.currentframe().f_code.co_name) print(sys._getframe().f_code.co_name) 

Обратите внимание, что вызовы inspect.stack в тысячи раз медленнее, чем альтернативы:

$ python -m timeit -s 'import inspect, sys' 'inspect.stack()[0][0].f_code.co_name' 1000 loops, best of 3: 499 usec per loop $ python -m timeit -s 'import inspect, sys' 'inspect.stack()[0][3]' 1000 loops, best of 3: 497 usec per loop $ python -m timeit -s 'import inspect, sys' 'inspect.currentframe().f_code.co_name' 10000000 loops, best of 3: 0.1 usec per loop $ python -m timeit -s 'import inspect, sys' 'sys._getframe().f_code.co_name' 10000000 loops, best of 3: 0.135 usec per loop 

Источник

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