Может кто-нибудь объяснить, как работает функция getattr(Object, function) при передаче переменных?

Итак, я работаю над некоторыми вопросами hackerrank, и кто-то опубликовал следующий фрагмент кода как часть решения, и мне было любопытно, может ли кто-нибудь объяснить это мне, пожалуйста?

getattr(l, parts[0])(*(map(int, parts[1:])))

В следующей теме:

Python использует getattr для вызова функции с переменными параметрами

Мгилсон упомянул, что это можно сделать для любой функции/метода, и я запутался.

В документации getattr() я не нашел информации о передаче *args после функции и поэтому был сбит с толку. Этот метод вообще применим ко всем функциям? Если да, то может ли кто-нибудь привести несколько основных примеров и объяснить, почему это так?

Я был бы очень признателен за это!


person InvestingScientist    schedule 08.09.2020    source источник


Ответы (1)


Вы не найдете этого в документации getattr, потому что передача аргументов функции с помощью оператора * — это совершенно другое.

Этот код:

l = "my_fun"
getattr(l, parts[0])(*(map(int, parts[1:])))

на самом деле эквивалентно:

l = "my_fun"
fun = getattr(l, parts[0])
fun(*(map(int, parts[1:])))

Вы получаете функцию с именем my_fun, затем вызываете эту функцию. map(int, parts[1:]) отображает элементы parts[1:] в целые числа, а затем оператор * распаковывает эти целые числа, чтобы использовать их в качестве аргументов fun.

Таким образом, это решение работает до тех пор, пока вызываемая функция имеет количество аргументов, равное len(parts[1:]).

Вот еще один пример с двумя файлами.

#  my_pack/__init__.py

def fun1(x):
    print('x =', x)

def fun2(x, y):
    print('x =', x, ', y =', y)


#  test.py
import my_pack

args = [1]
fun = getattr(my_pack, 'fun1')
fun(*args)

#  equivalent solution
fun = getattr(my_pack, 'fun1')(*args)

args = [1, 2]
fun = getattr(my_pack, 'fun2')(*args)

@mgilson сказал, что этот принцип вызова функции без явного перечисления всех ее параметров, но с использованием оператора * полностью независим от getattr. Как, например, здесь, где я не использую getattr:

def my_cool_func(a, b, c):
   print(a, b, c)

my_cool_func(*[1, 2, 3])  #  prints "1 2 3"
person qouify    schedule 09.09.2020
comment
Спасибо за объяснение этого, это оказалось очень полезным! - person InvestingScientist; 22.09.2020