Python :как использовать лямбда или партиал для привязки аргументов, отличных от первого позиционного аргумента

У меня много путаницы при попытке использовать 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, либо просто отбрасывают его (. Я не уверен, что ).

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

Кажется, это должно быть достаточно просто. Что мне не хватает?

6
задан ely 6 August 2012 в 18:02
поделиться