У меня много путаницы при попытке использовать lambda
или functools.partial
для создания новой функции со связанными позиционными аргументами из существующей функции.
Я хочу сделать что-то вроде этого (, которое ведет себя не так, как хотелось бы):
def addFunction(self, name, in_function, secondary_args=None, secondary_kwargs=None):
# Assign the function with optional args based on whether any
# optional args are not None
if secondary_args is not None and secondary_kwargs is not None:
func = lambda x: in_function(x, *secondary_args, **secondary_kwargs)
elif secondary_args is None and secondary_kwargs is not None:
func = lambda x: in_function(x, **secondary_kwargs)
elif secondary_args is not None and secondary_kwargs is None:
func = lambda x: in_function(x, *secondary_args)
else:
func = in_function
###
func.__doc__ = in_function.__doc__
self[name] = func # <-- This method is a class method for something deriving dict.
Я также попытался заменить все операторы lambda
эквивалентными операторами functools.partial
.
Проблема в том, что если я использую эту функцию вот так:
# Assume some_function takes 3 arguments, a float, a Bool, and a String,
# in that order.
someObject.addFunction("my_f", some_function, secondary_args=[True, "Option_A"])
теперь, когда я пытаюсь использовать (, например,)someObject["my_f"](5.0)
он сообщает, что первый аргумент True
при отладке.
Кажется, что привязки либо с lambda
, либо с partial
просто вставляют позиционные аргументы и либо принимают ваш дополнительный позиционный аргумент только в конце *args
, либо просто отбрасывают его (. Я не уверен, что ).
Для моего приложения, поскольку множество функций будет храниться в конкретном объекте, подобном этому, с различным количеством необязательных аргументов, выбранных пользователем, важно, чтобы возвращаемая функция со связанными аргументами по-прежнему принимала аргумент пользователя в качестве первого позиционный аргумент, не прибегая к тому, чтобы все аргументы были ключевыми -словесными аргументами.
Кажется, это должно быть достаточно просто. Что мне не хватает?