Передача переменных в функцию Python - PullRequest
0 голосов
/ 27 апреля 2018

У меня следующая ситуация: у меня есть один master_function, в который я хочу передать sub_function. Функция, которую я хочу передать в это изменения (например, 1 и 2). Аргументы каждой функции также различаются по количеству и типу.

def sub_function_1( x, y, z):
   return x + y + z

def sub_function_2( x, y ):
   return x + y 

def master_function( x, y, z, F ): 
   return x*y + F()

Быстрое исправление

Простым решением проблемы было бы написание функции обратного вызова со всеми возможными аргументами, независимо от того, используются они или нет:

   def master_function( x, y, z, F ): 
       return x*y + F(x,y,z)

Тогда мы можем позвонить master_function( x, y, z, sub_function_1) или master_function( x, y, z, sub_function_2) по желанию.

К сожалению, у меня есть много функций, которые я хочу передать главной функции; так что такой подход не подходит!

Есть ли способ написать F в master_function без ссылки на требуемые аргументы? Как я могу обобщить это?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вот ваш код, обновленный в соответствии с дубликатом, который я упомянул.

def sub_function_1( x, y, z):
   return x + y + z

def sub_function_2( x, y ):
   return x + y 

def master_function(*args):
   F = args[-1]
   F_args = args[:-1]
   x = args[0]
   y = args[1]

   return x*y + F(*F_args)

print(master_function(1, 2, 3, sub_function_1))
print(master_function(-10, -20, sub_function_2))

Выход:

8
170
0 голосов
/ 27 апреля 2018

Лучший способ - сделать вызовы постоянными

def sub_function_1( x, y, z):
    return x + y + z

def sub_function_2( x, y, z ):
    return x + y 

def master_function( x, y, z, F ): 
    return x * y + F(x,y,z) 

Но вы можете сделать его более динамичным, если хотите:

def sub_function_1( x, y, z, **kwargs):
    return x + y + z

def sub_function_2( x, y, **kwargs ):
    return x + y 

def master_function( x, y, z, F ): 
    return x * y + F(**locals())

Это лучше работает в потенциале Python 3:

def sub_function_1(*args):
    return args[0] + args[1] + args[2]

def sub_function_2(*args):
    return args[0] + args[1] 

def master_function(*args, F): 
    return args[0] * args[1] + F(*args) 
.
.
.
>>> master_function(1,2,3,F=sub_function_1)
8
>>> master_function(1,2,3,F=sub_function_2)
5
>>> master_function(1,2,F=sub_function_2)
5
>>> master_function(1,2,F=sub_function_1)
IndexError: tuple index out of range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...