Передача функции Python в качестве аргумента без ее выполнения?

У меня есть эта функция:

def a(one, two, the_argument_function):
    if one in two:
        return the_argument_function

моя функция the_argument_function выглядит примерно так:

def b(do_this, do_that):
    print "hi."

Оба вышеперечисленных импортируются в файл «main_functions.py», чтобы мой окончательный код выглядел так:

print function_from_main(package1.a, argument, package2.b(do_this, do_that)

Функция «if one in two» из «a» работает, но функция «b» по-прежнему выполняется при передаче в «function_from_main», не дожидаясь проверки от «a», чтобы увидеть, действительно ли она должна выполняться.

Что я могу сделать?


person Dan Von    schedule 22.04.2017    source источник
comment
Вы вызываете b явно, как он не будет выполняться?   -  person timgeb    schedule 22.04.2017
comment
@timgeb Вы прекрасно поняли мой вопрос .. Итак, как я могу заставить его не выполняться?   -  person Dan Von    schedule 22.04.2017
comment
не называй..   -  person timgeb    schedule 22.04.2017
comment
@timgeb Возможно, я не правильно написал свои вопросы? Я хочу вызвать его, но только если выполняется одно из двух, из package1.a , в противном случае моя функция function_from_main не знает, какую функцию на самом деле вызывать, каким-то образом мне нужно сказать ей, фактически не выполняя ее.   -  person Dan Von    schedule 22.04.2017
comment
но вы вызываете функцию явно, не дожидаясь проверки, когда вы передаете ее результат function_from_main.   -  person timgeb    schedule 22.04.2017
comment
передать функцию, а не возвращаемое значение?   -  person timgeb    schedule 22.04.2017
comment
Это именно то, что я пытаюсь сделать. Я просто не знаю /как/ написать конкретный кусок кода, так как я не так хорош. Можете ли вы дать мне фрагмент? Все, что я пытаюсь сделать, это снова сказать main_func не выполнять эту функцию, а сохранить ее дескриптор, а затем, ВОЗМОЖНО, выполнить ее позже, если будет проверено одно из двух.   -  person Dan Von    schedule 22.04.2017
comment
function_from_main(..., package2.b, ...) - теперь у вас есть ссылка на функцию b внутри function_from_main, которая может вызывать или не вызывать ее.   -  person timgeb    schedule 22.04.2017
comment
Я попытался понять, что вы имеете в виду, и немного ошибся. Что я сделал, так это добавил *args и в своем основном я сделал: function_from_main(..,.., a, 'arg_to_a'), что, похоже, решило эту проблему.   -  person Dan Von    schedule 22.04.2017


Ответы (1)


package2.b(do_this, do_that) — это вызов функции (имя функции, за которым следуют круглые скобки). Вместо этого вы должны передавать только имя функции package2.b функции a

Вам также потребуется изменить функцию a таким образом, чтобы функция вызывалась при выполнении условия.

# function a definition 
def a(one, two, the_argument_function, argument_dict):
    if one in two:
        return the_argument_function(**argument_dict)

def b(do_this, do_that):
    print "hi."

# function call for a
a(one, two, b, {'do_this': some_value, 'do_that': some_other_value}) 
person shanmuga    schedule 22.04.2017
comment
Спасибо, это сработало. - person Dan Von; 22.04.2017
comment
Пожалуйста, отметьте ответ как принятый, если решение сработало. Это поможет другим пользователям легко найти ответ. - person shanmuga; 22.04.2017