как узнать имя функции python
Как получить имя функции как строку в Python?
Автор оригинала: Chris.
Постановка проблемы
Учитывая функциональный объект, назначенный на имя. Как получить имя функции как строку?
Например, рассмотрим следующую функцию your_function Отказ Как получить имя «your_function» из этого?
Ваше желаемое значение результата хранится в string_name это строка «your_function» Отказ
Метод 1: Используйте атрибут __name__
Тем не менее, есть важный случай, когда этот метод потерпит неудачу.
Это демонстрируется в следующем минимальном примере:
Как оба имена указывают на тот же объект памяти, но func_2 Во-первых, указывал на это имя объекта func_2 Отказ Использование памяти этого кода визуализируется с помощью инструмента Python Reputor:
Обе переменные относятся к тому же объекту функции, которые по умолчанию как func_2 имя.
Метод 2: Используйте атрибут __qualname__
Следующий код создает функцию и способ внутри класса. Затем он сравнивает вывод __name__ и __qualname__ Атрибуты как функции, так и класса:
Вы можете погрузиться глубже в идиосинкразиях __qualname__ здесь и здесь Отказ
Спасибо за прочтение этой статьи. Чтобы повысить свои навыки Python, подумайте о том, чтобы присоединиться к бесплатной академии электронной почты Finxter с большим количеством чит-листов, учебников Python и забиты забавных программиров! 🙂
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Функции Python: Объяснено для начинающих
Функция (иногда называемая методом или процедурой) – это набор операторов, предназначенных для выполнения определенной задачи. На функции Python обычно ссылаются по имени, и в этом случае,…
Функции Python обычно | ссылаются на имя, и в этом случае набор операторов может быть повторно использован или выполнен столько раз, сколько необходимо в программе. Это способ запускать одни и те же операторы из нескольких мест в программе без необходимости переписывать их каждый раз, когда они необходимы.
В этой статье рассматриваются следующие точки соприкосновения :
Как определить функции в Python
Из нашей вышеприведенной функции:
Параметры функции и вызов функции
Функция параметры – это имена, используемые для представления реальных значений, которые предоставляются при вызове функции. Давайте определим вызов функции как запрос на выполнение нашей функции. Чтобы вызвать нашу функцию, нам нужно только написать ее имя, за которым следует скобка. В следующем блоке мы назначим вызов функции переменной. Это означает, что значение нашей переменной будет равно возвращаемому значению нашей функции:
Наш приведенный выше код вернется:
Наша функция может возвращать различные выходные данные на основе предопределенных условий в своем определении. Например, если мы хотим работать только с небольшими числами, мы можем выбрать другой вывод, если оба числа при суммировании будут больше, чем 100 :
Оператор возврата
Функция также возвращает None по умолчанию, когда ключевое слово return указано без значения. Это делает его пустым возвратом :
Позиционные аргументы
Аргументы ключевых слов
Необходимые аргументы
Аргументы по умолчанию
Чтобы сделать аргумент | необязательным в вызове функции, мы должны присвоить ему значение по умолчанию в нашем определении функции. Это значение по умолчанию будет использоваться, если во время вызова функции не будет указан аргумент для этого параметра :
Произвольные аргументы
Лямбда-функции Python
Несколько вещей, которые следует отметить:
Чтобы иметь возможность повторно использовать лямбда-функцию, мы можем назначить ее переменной:
Область действия переменной
Чтобы сделать нашу переменную word доступной для каждого оператора и выражения в нашем коде, мы должны объявить ее вне определения функции. Таким образом, он глобально ограничен :
Важные вещи, которые следует отметить
При определении функции с помощью ключевого слова def после имени функции и двоеточия тело функции должно быть отступом от следующей строки.
Обратите внимание, как мы планировали наше тело функции в def определениях функций. Это способ сказать Python, что все, что мы собираемся написать дальше, относится к нашему определению функции. Если тело вашей функции не имеет отступа, Python будет считать, что вы начали другой оператор:
Имя функции должно быть описательным, прямым и вневременным.
Имя функции должно быть описательным, прямым и вневременным.
Именование функций является очень важной частью определения функций, и при правильном выполнении ваш код станет более читаемым, удобным для обслуживания и в дальнейшем приведет к повышению производительности.
При именовании своих функций важно не использовать сленги, которые понимают лишь немногие люди, или тенденции, с которыми люди могут иметь дело только в данный момент времени. Пусть ваши имена функций будут достаточно описательными, прямыми и вневременными.
Когда вы определяете свою функцию, рекомендуется возложить на нее только одну ответственность и заставить ее делать то, что предполагает ее название. Это означает, что из наших примеров выбор суммирования двух чисел при делении каждого числа в другом кортеже на два в одной и той же функции не был бы хорошей идеей. Как и мы, лучше разделить эти два действия на отдельные функции.
Сделав это, вы не только улучшите читаемость кода , но и облегчите его тестирование и отладку.
Вот мой недавний подкаст о том, как преуспеть в первый год работы инженером-программистом. Я поделился несколькими своими впечатлениями в области технологий и вещами, которые я хотел бы, чтобы кто-то рассказал мне в течение моего первого года работы инженером-программистом: Как преуспеть в свой первый год работы инженером-программистом
Функции в Python, определение функций.
Первым оператором тела функции может быть строка документации функции. Существуют инструменты, которые используют строки документации для автоматического создания интерактивной или печатной документации или для предоставления пользователю интерактивного просмотра кода. Хорошей практикой является включение строк документации в код.
Определение функции не выполняет тело функции, а только вычисляет аргументы, если они присутствуют. Тело функции выполняется только при вызове.
При вызове функции создается область видимости для хранения локальных переменных этой функции и все созданные переменные внутри функции сохраняют свое значение только в этом пространство имен. Когда функция завершает выполнение, это пространство имен уничтожается.
Определение функции может быть заключено в одно или несколько выражений-декоратора. Выражения-декораторы оцениваются при определении функции в области, содержащей определение функции. Результатом должен быть вызываемый объект, который вызывается с объектом функции в качестве единственного аргумента. Возвращаемое значение привязывается к имени функции, а не к объекту функции. Несколько декораторов применяются вложенным образом. Например, следующий код
Значения параметров по умолчанию оцениваются слева направо при определении функции. Это означает, что эти выражение вычисляется один раз, когда функция определена, и что для каждого вызова используется одно и то же предварительно вычисленное значение. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь
Параметры аргументов, следующие после * или *identifier являются параметрами только ключевых слов и могут быть переданы только в качестве ключевых аргументов (более подробно в разделе «Варианты передачи аргументов в функцию Python»).
Так как функции в Python являются объектами первого класса, то значение имени функции имеет тип, который распознается интерпретатором как определяемая пользователем функция. Это значение может быть присвоено другому имени, которое затем может также использоваться как функция:
Исходя из других языков, можно возразить, что fib это не функция, а процедура, поскольку она не возвращает значение. На самом деле, даже функции без оператора return возвращают значение, хотя и довольно скучное. Это значение называется None (встроенное имя). Вывод значения None обычно подавляется интерпретатором, если это единственное возвращаемое значение. Вы можете увидеть это, используя команду print() :
Функция, которая возвращает список чисел ряда Фибоначчи, вместо того, чтобы печатать его:
Этот пример, демонстрирует некоторые новые возможности Python:
Функции в Python
Функция позволяет использовать в программе один и тот же фрагмент кода несколько раз.
Oбъявление функции в Python выглядит так:
# Объявление функции
def hello (name):
print ( ‘Hello, ‘ + name)
# Вызовы функции
hello ( ‘Max’ )
hello ( ‘Ivan’ )
hello ( ‘Alex’ )
hello ( ‘Kate’ )
# Вывод
>> Hello, Max
>> Hello, Ivan
>> Hello, Alex
>> Hello, Kate
Оператор return возвращает значение из функции.
Представьте себе обычный калькулятор. Вы вводите первое число, операцию и второе число. Калькулятор возвращает нам результат операции над этими числами. Всё просто, не так ли? Функции точно так же умеют возвращать значение с помощью специального оператора return.
print ( f ‘s1 =
print ( f ‘s2 =
print ( f ‘s3 =
>> s1 = 12
>> s2 = 208
>> s3 = 4
print ( f ‘m1 =
print ( f ‘m2 =
print ( f ‘m3 =
>> m1 = 20
>> m2 = 10800
>> m3 = 3
Для параметров функции можно указывать значения по умолчанию. Это дает возможность вызывать функцию с меньшим числом параметров.
# Аргумент name по умолчанию равен ‘world’
def hello ( name = ‘world’ ):
print ( ‘Hello, ‘ + name)
hello ()
hello ( ‘Ivan’ )
>> Hello, world
>> Hello, Ivan
Примеры
# Написать функцию square(), вычисляющую квадрат числа.
def square ( number ):
return number * number # Возвращаем результат работы функции обратно в программу
a = square ( 2 )
print (a)
print ( isEven ( 10 ))
print ( isEven ( 11 ))
# Напишите функцию amountList, которая возвращает сумму всех элементов списка.
def amountList ( lst ):
amount = 0
f or x in lst:
amount += x
return amount
print ( f ‘Сумма списка ‘ )
print ( fib ( 2 ))
print ( fib ( 3 ))
print ( fib ( 4 ))
print ( fib ( 5 ))
print ( fib ( 10 ))
print ( fact ( 2 ))
print ( fact ( 3 ))
print ( fact ( 4 ))
print ( fact ( 5 ))
Решение задач
Напишите функцию, которая получает в качестве аргумента радиус круга и находит его площадь.
# Не забудьте написать функцию circle.
print ( circle ( 4 ))
print ( circle ( 1 ))
# Не забудьте написать функцию three.
print ( three ( 4 ))
print ( three ( 3 ))
3. Максимум в списке
Напишите функцию, которая возвращает максимальный элемент из переданного в нее списка.
Напишите функцию, которая возвращает количество четных элементов в списке.
Напишите функцию, которая возвращает список с уникальными (неповторяющихся) элементам.
Отладка Python: получить имя файла и номер строки, из которой вызывается функция?
В настоящее время я создаю довольно сложную систему на Python, и когда я отлаживаю, я часто помещаю простые операторы печати в несколько скриптов. Чтобы сохранить обзор, я также часто хочу распечатать имя файла и номер строки, где находится оператор печати. Конечно, я могу сделать это вручную или с помощью чего-то вроде этого:
Который печатает что-то вроде:
Чтобы сделать это проще, я хочу иметь возможность сделать что-то вроде:
Итак, я поместил это в функцию где-то и попытался сделать:
К сожалению, я получаю:
Он выводит имя файла и номер строки, в которой я определил функцию, вместо строки, в которой я вызываю debuginfo (). Это очевидно, потому что код находится в файле debugutil.py.
Итак, мой вопрос на самом деле: Как я могу получить имя файла и номер строки, из которой вызывается эта функция debuginfo ()? Все советы приветствуются!
4 ответа
Функция inspect.stack() возвращает список записи фреймов, начиная с вызывающего абонента и выходя, который вы можно использовать для получения необходимой информации:
Если вы помещаете свой код трассировки в другую функцию и вызываете его из основного кода, вам необходимо убедиться, что вы получаете информацию о стеке от деда, а не от родителя или самой функции трассировки.
Ниже приведен пример трехуровневой глубокой системы, чтобы уточнить, что я имею в виду. Моя основная функция вызывает функцию трассировки, которая вызывает еще одну функцию для выполнения работы.
Это напечатает что-то вроде:
Функция trace_library_do () вверху является примером того, что вы можете поместить в библиотеку, а затем вызвать из других функций трассировки. Значение относительной глубины определяет, какая запись в стеке Python будет напечатана.
Я уверен, что кто-то возразит, что я использую внутренние поля с данными, возвращаемыми структурами проверки, так как вполне могут быть функции доступа, которые делают то же самое для вас. Но я нашел их, пройдя через этот тип кода в отладчике Python, и они работают, по крайней мере, здесь. Я использую Python 2.7.12, ваши результаты могут быть очень, если вы используете другую версию.
В любом случае, я настоятельно рекомендую вам импортировать проверяющий код в какой-то собственный код Python и посмотреть, что он может вам предоставить, особенно если вы можете пошагово пройти код в хорошем отладчике Python. Вы узнаете много нового о том, как работает python, и узнаете как о преимуществах языка, так и о том, что происходит за кулисами, чтобы сделать это возможным.
Просто поместите код, который вы разместили в функцию:
А затем используйте его как хотите:
Я рекомендую вам поместить эту функцию в отдельный модуль, чтобы вы могли использовать ее каждый раз, когда вам это нужно.
Обнаружил этот вопрос для некоторой связанной проблемы, но я хотел больше подробностей о выполнении (и я не хотел устанавливать весь пакет графа вызовов).