#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