Ограничение функции путем фиксации аргумента

Как сделать функцию с меньшей размерностью, чем исходная, зафиксировав ее аргумент:

Например, я хочу сделать функцию-преемник из функции суммы следующим образом:

def add(x,y):
    return x+y

Теперь я ищу что-то вроде этого:

g = f (~, 1), которая будет функцией-преемником, т.е. g(x)=x+1.

2 ответа

Решение

Вы можете написать свою собственную функцию:

def g(y):
    return f(2, y)

Или более кратко:

g = lambda y: f(2, y)

Есть также functools.partial:

import functools

def f(x, y):
    return x + y

g = functools.partial(f, 2)

Затем вы можете позвонить, как и раньше:

>>> g(3)
5

Если вы делаете больше, чем немного, то вы можете использовать что-то вроде декоратора.

def with_x(x, fn, name=None):
  def foo(*args, **kwargs):
    return fn(x, *args, **kwargs)
  if name:
    foo.__name__ = name
return foo

def example(x,y):
  return x**y

g = with_x(2, example)

g(3)  #8

Используйте параметр name =, если вам важно имя полученной функции. Вы могли бы полюбить другие хаки во встроенную функцию, возможно, используя модуль inspect, если это необходимо. Но затем вы переписали ранее упомянутые части функций functools просто для того, чтобы избежать необходимости приводить ключевые аргументы.

Другие вопросы по тегам