В этом руководстве по Python мы обсудим «Как вызвать функцию по имени строки в Python», увидим 8 различных подходов с некоторыми наглядными примерами.

Содержание

Вызов с помощью функции getattr()

Функция getattr() в Python извлекает значение указанного атрибута из объекта, что полезно для того, чтобы сделать ваш код более читабельным, особенно при работе с динамическим доступом к атрибуту для вызова функции по имени строки.

Код:

import math
function_name = 'sqrt'
calculate_square_root = getattr(math, function_name)
result = calculate_square_root(25)
print(result)

В этом коде getattr(math, function_name) извлекает атрибут sqrt из математического модуля Python. Этот атрибут представляет собой функцию, которая вычисляет квадратный корень в Python.

calculate_square_root = getattr(math, function_name)

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

Выход:

5.0

Приложены снимки, иллюстрирующие код Python и соответствующий вывод в Visual Studio.

Вызов с помощью функции getattr()

С помощью globals()

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

Код:

def calculations(a, b):
    print(f'Addition : {a+b}')
    print(f'Subtraction : {a-b}')
    print(f'Multiplication : {a*b}')
    print(f'Division : {a/b}')
    
function_name = globals()['calculations']
function_name(30,15)

В этом коде function_name присваивается значение, полученное из глобальной таблицы символов с помощью globals()[‘calculations’], функционального объекта вычислений.

Выход:

Addition : 45
Subtraction : 15
Multiplication : 450
Division : 2.0

Вот объединенное представление сценария Python и его результатов в Visual Studio.

С помощью globals()

С использованием словаря

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

Код:

def calculate_tax(income, tax_rate):
    return income * tax_rate

functions_dict = {
    'calculate_tax': calculate_tax,
}
function_name = 'calculate_tax'
if function_name in functions_dict:
    print(functions_dict[function_name](50000, 0.2))

Создается словарь с именем Function_dict, где ключ Calculate_tax соответствует функции Calculate_tax. Далее переменной function_name присваивается строка «calculate_tax».

if function_name in functions_dict:
    print(functions_dict[function_name](50000, 0.2))

Оператор if проверяет, существует ли function_name в файле function_dict, и если да, то он вызывает функцию, используя функции_dict[function_name] со своими аргументами.

Выход:

10000.0

Ниже показан код Python вместе с его выходными данными, полученными в Visual Studio.

Код Python вместе с его выходными данными

С помощью eval()

Мы можем использовать функцию eval() в Python для выполнения строки как кода Python. Сюда входит динамический вызов функций на основе имен строк.

Код:

def customer_service_greeting(name):
    return f'Hello {name}, thank you for contacting our customer service. How can I assist you today?'

function_name = 'customer_service_greeting'
func = eval(function_name)
print(func('Peter Parker'))

Выход:

Hello Peter Parker, thank you for contacting our customer service. How can I assist you today?

Представлен скриншот кода Python и его вывода в Visual Studio.

С помощью eval() 

С помощью exec()

Вы можете вызвать функцию из имени строки, используя функцию exec() и динамическое назначение переменных в Python.

Этот подход позволяет динамически выполнять код, определенный строками.

Вот пример кода:

def calculate_sales_tax(amount):
    tax_rate = 0.08  
    return amount * tax_rate

function_name = 'calculate_sales_tax'
exec(f'my_func={function_name}')
my_func = globals()['my_func']
print(my_func(100))

Функция exec() используется для динамического выполнения строки f’my_func={function_name}’, эффективно создавая переменную my_func, которая содержит объект функции Calculation_sales_tax в Python.

exec(f'my_func={function_name}')

my_func извлекается из глобальной таблицы символов с помощью globals()[‘my_func’] и вызывается с аргументом в Python.

Выход:

8.0

Прикреплено объединенное изображение, показывающее как код Python, так и его выходные данные в Visual Studio.

Объединенное изображение

С помощью locals().py

locals() — это встроенный метод Python, который мы можем вызвать методом из имен строк.

Мы вызвали locals(), фактически получив доступ к объекту метода Calcult_shipping_cost из таблицы локальных символов.

Код:

def calculate_shipping_cost(weight, distance):
    rate_per_mile = 0.5 
    return weight * distance * rate_per_mile

print(
locals()['calculate_shipping_cost'](20, 100)
)

Выход:

1000.0

Вот сводное представление кода Python и его вывода в Visual Studio.

С помощью locals().py

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

Мы также можем вызвать метод класса по имени строки в Python, используя getattr(). Мы объяснили метод getattr() в первом примере.

Код:

class Customer():
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    def get_full_name(self):
        return self.first_name + ' ' + self.last_name

custormer_object = globals()['Customer']
customer1 = custormer_object('John', 'Doe')
func = getattr(customer1, 'get_full_name')
print(func()) 

Выход:

John Doe

Ниже приведен объединенный снимок экрана кода Python и его вывода в Visual Studio.

Объединенный снимок экрана кода

С помощью модуля importlib

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

Код:

# Emp_Details.py 

class Employee:
    def __init__(self, first, last):
        self.first = first
        self.last = last

    def get_name(self):
        return self.first + ' ' + self.last

Код для файла main.py:

# main.py 

import importlib
module = importlib.import_module('Emp_Details')
cls = getattr(module, 'Employee')
emp1 = cls('John', 'Doe')
func = getattr(emp1, 'get_name')
print(func())

Этот код содержит два файла: Emp_Details.py, который определяет класс «Сотрудник», и «main.py», куда импортируется класс «Сотрудник» из Emp_Details.py.

import importlib
module = importlib.import_module('Emp_Details')
cls = getattr(module, 'Employee')

И getattr(module, ‘Employee’) извлекает объект класса «Сотрудник» из импортированного модуля. Ниже показано, как динамически вызывать функцию модуля с помощью модуля importlib в Python.

Выход:

John Doe

Ниже приведен снимок экрана с двойным представлением, показывающий код Python и его выходные данные в Visual Studio.

Снимок экрана с двойным представлением

Выходные данные в Visual Studio

Заключение

Здесь мы рассмотрели различные методы вызова функции по имени строки в Python, продемонстрировав восемь подходов и техник. Мы обсудили, как использовать встроенные функции, такие как getattr(), globals(), eval(), exec() и locals(), а также использовать словари, методы классов и модуль importlib для вызова функций по имени строки.

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

Добавить комментарий