Переопределение функции в python - PullRequest
1 голос
/ 10 июля 2020

предположим, что есть функция, подобная приведенной ниже:

def func(arg1, args2):
    # do sth using arg1 and arg2

Во время выполнения я хотел бы продолжать использовать какое-то значение для args2, которое мы не можем знать при определении func.

Итак, что я хотел бы сделать:

func_simpler = func(, args2=some_value_for_arg2)
func_simpler(some_value_for_arg1) # actual usage

Есть идеи по этому поводу? Я знаю, что есть обходной путь, например определение func лучше, но я ищу решение, больше похожее на func_simpler. Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 10 июля 2020

Вы можете использовать lambda в python

Исходная функция

def func(arg1, arg2):

Тогда вы получите желаемое значение как по умолчанию для arg2 и определите simple_fun c

simple_func = lambda arg1 : func(arg1, arg2=new_default)

Теперь вы можете запустить simple_fun c

simple_func("abc") #"abc" = value for arg1

Надеюсь, я смогу вам помочь

2 голосов
/ 10 июля 2020

Используйте functools.partial:

from functools import partial

def func(arg1, arg2):
    print(f'got {arg1!r} and {arg2!r}')

simple_func = partial(func, arg2='something')
simple_func("value of arg1")
# got 'value of arg1' and 'something'

Использование partial создает объект , который имеет различные преимущества перед использованием функции-оболочки:

  • Если исходная функция и ее аргументы могут быть pickle d, объект partial также может быть pickle d.
  • repr / str из * Объект 1020 * показывает исходную информацию о функции.
  • Повторное применение partial эффективно, так как оно сглаживает оболочки.
  • Функция и ее частично примененные аргументы могут быть проверены.

Обратите внимание, что если вы хотите частично применить аргументы метода, используйте вместо этого functools.partialmethod.

2 голосов
/ 10 июля 2020

Я сам пытался решить эту проблему и нашел неплохое решение:

def func(a, b):
    print(a, ": variable given everytime the model is used")
    print(b, ": variable given when the model is defined")
enter code here
def model(b):
    def model_deliver(a):
        func(a, b)
    return model_deliver
s = model(20)
s(12) #prints result as below
# 12 : variable given everytime the model is used
# 20 : variable given when the model is defined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...