Автор оригинала: Chris.
Постановка проблемы
Учитывая функциональный объект, назначенный на имя. Как получить имя функции как строку?
Например, рассмотрим следующую функцию 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
что ты ожидал.
Это демонстрируется в следующем минимальном примере:
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 и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/how-to-get-a-function-name-as-a-string-in-python/”