Указатель функции Python с разными аргументами

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

Я определил три функции.

 def evaluate1(a, b):
    pass
  
 def evaluate2(a, b):
    pass
  
 def evaluate3(a, b, c):
    pass
  

Что я хочу сделать, используйте указатель для записи, какую функцию оценки я буду использовать в зависимости от test входных данных. Логика, как показано ниже:

 def test(a, b, c, d):
    # let evaluate_function records which evaluate function I will use
    if c > 1:
        evaluate_function = evaluate3 # not sure
    else:
       if d:
           evaluate_function = evaluate1
       else:
           evaluate_function = evaluate2

    # execute the evaluate function
    evaluate_function(a, b, ?)
  

Однако, поскольку evaluate3 имеет разные аргументы от evaluate1 и evaluate3 . Как мне следует поступить? Спасибо!

Комментарии:

1. используйте **kwargs это поможет вам с динамическими подписями.

2. Должны ли они иметь разные аргументы? Если да, не могли бы вы использовать, например, functools.partial или lambda , чтобы обернуть тот, который принимает три аргумента, таким образом, чтобы результирующий evaluate_function результат всегда принимал два аргумента? Если нет, было бы проще, если бы они этого не делали.

3. Используйте *args в определениях

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

5. Отличается ли код во всех трех функциях?

Ответ №1:

Вам пришла в голову хорошая идея использовать «указатель на функцию» для выбора функции. Но поскольку вы знаете, какую функцию вы выбираете в данный момент, вы также можете связать параметры:

 def test(a, b, c, d):
    # let evaluate_function records which evaluate function I will use
    if c > 1:
        evaluate_function = evaluate3 # not sure
        params = a,b,d
    else:
       if d:
           evaluate_function = evaluate1
           params = a,b
       else:
           evaluate_function = evaluate2
           params = a,c

    # execute the evaluate function
    evaluate_function(*params)
  

Я оставлю это вам, чтобы правильно выбрать params .

Ответ №2:

Почему бы просто не вызвать функции оценки напрямую вместо того, чтобы присваивать их функции как таковой. Делает его более читабельным

 def evaluate1(a, b):
    print('evaluate1')

def evaluate2(a, b):
    print('evaluate2')

def evaluate3(a, b, c):
    print('evaluate3')

def test(a, b, c=None, d=None):
    # let evaluate_function records which evaluate function I will use
    if c and c > 1:
        evaluate3(a, b, c)
    else:
       if d:
           evaluate1(a, b)
       else:
           evaluate2(a, c)

test(1,2,c=0.1,d=1)
#evaluate1
test(1,2)
#evaluate2
test(1,2,3)
#evaluate3