Как вызвать одну конкретную функцию, которая находится внутри другой функции? - PullRequest
0 голосов
/ 11 октября 2019

Я хочу иметь возможность сделать что-то вроде этого:

def calculations(a,b):
    def add(a,b):
        return a+b
    def subtract(a,b):
        return a-b

def other_function(calculations,c,d):
    return calculations(c,d) + 10

result = other_function(add,10,5)
print(result)
>>> 25

Это просто упрощенный пример, но я хочу, чтобы функция "вычисления" делала 2 разные вещи, не пропуская этот выборв качестве параметра функции.

Затем я хотел бы использовать этот выбор в качестве параметра функции для другой функции "other_function".

Кажется, что-то похожее работает при определении "вычислений" как класса, но это не то, чтоЯ хочу использовать.

Несмотря на то, что определение «сложения» и «вычитания» внутри другой функции кажется не очень практичным, это то, что я хочу сделать.

Ответы [ 5 ]

1 голос
/ 11 октября 2019

Вы можете передать функцию, и она не должна (и не должна быть ) внутри другой функции.

Это будет прекрасно работать, если вы избавитесь от внешнегофункция!

def add(a,b):
    return a+b

def subtract(a,b): # you also had a typo here - it's subtrack, not sub_S_track ;)
    return a-b

def other_function(calculations,c,d):
    return calculations(c,d) + 10

result = other_function(add,10,5)
print(result)

Что случилось?

calculations в other_function означает просто имя параметра (вы передаете его при вызове функции!).

0 голосов
/ 11 октября 2019

В результате всех обсуждений здесь я понял, чего я хочу. Спасибо за ваш вклад!

def calculations(a,b):

    global add
    def add(a, b):
        return a + b

    global subtract
    def subtract(a, b):
        return a - b

    return add, subtract

def other_function(calculations, a, b):
    e = a + 19
    return calculations(e, b)

a = 10
b = 5

calculations(a,b)
result = other_function(add, a,b)
print(result)
>>>

Это ни в коем случае не питон или элегантность, но удовлетворяет следующим условиям, которые я искал:

  • две функции - "добавить", "вычесть "- внутри другой функции" вычисления "
  • вызвать одну из этих функций -" добавить "- без указания ее в качестве параметра функции" вычисления "
  • использовать эту выбранную функцию в качестве параметра для другойфункция "other_function"
0 голосов
/ 11 октября 2019

Вот решение, использующее namedtuple, чтобы получить то, что вы хотите.

from collections import namedtuple
ops = namedtuple('Ops', ['add', 'subtract'])


def add(a, b):
    return a + b


def subtract(a, b):
    return a - b


def calculations():
    return ops(add, subtract)


def other_function(calc, a, b):
    return calc(a, b) + 10


result = other_function(calculations().add, 10, 5)

Использование класса будет намного чище.

0 голосов
/ 11 октября 2019

Вы можете передать строку и поместить функции в словарь:

def calculations(key, a,b):
    def add(a, b):
        return a + b
    def substract(a, b)
        return a - b
    fns = {"add": add, "substract": substract}
    return fns[key](a, b)


result = calculations("add", 10, 5)

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

0 голосов
/ 11 октября 2019

вы можете определить одну функцию следующим образом:

def calculate(mode, a, b):
    if mode == "add":
        return a + b
    elif mode == "substract":
        return a - b

, и вы можете добавить любые операции, которые вы хотите к этой функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...