Можно ли изменить параметры по умолчанию в Python?

В Python можно переопределить параметры функции по умолчанию во время выполнения?

Я определил функцию с тремя параметрами:

def multiplyNumbers(x,y,z): return x*y*z print(multiplyNumbers(x=2,y=3,z=3)) 

Затем я попытался (безуспешно) установить значение параметра по умолчанию для y, а затем я попытался вызвать функцию без параметра y :

 multiplyNumbers.y = 2; print(multiplyNumbers(x=3, z=3)) 

Но была произведена следующая ошибка, поскольку значение по умолчанию y не было установлено правильно:

 TypeError: multiplyNumbers() missing 1 required positional argument: 'y' 

Можно ли переопределить параметры функции по умолчанию во время выполнения, как я пытаюсь сделать здесь?

3 Solutions collect form web for “Можно ли изменить параметры по умолчанию в Python?”

Просто используйте functools.partial

  multiplyNumbers = functools.partial(multiplyNumbers, y = 42) 

Одна проблема здесь: вы не сможете назвать ее multiplyNumbers(5, 7, 9); вы должны вручную сказать y=7

Если вам нужно удалить аргументы по умолчанию, я вижу два способа:

  1. Хранить оригинальную функцию где-то

     oldF = f f = functools.partial(f, y = 42) //work with changed f f = oldF //restore 
  2. использовать partial.func

     f = f.func //go to previous version. 

Технически, можно делать то, что вы просите … но это не очень хорошая идея. Ответ RiaD – это питоновский способ сделать это.

В Python 3:

 >>> def f(x=1, y=2, z=3): ... print(x, y, z) >>> f() 1 2 3 >>> f.__defaults__ = (4, 5, 6) 4 5 6 

Как и все остальное, что находится под обложками и трудно найти в документах, диаграмма модулей inspect – лучшее место для поиска атрибутов функции.

Детали немного отличаются в Python 2, но идея такая же. (Просто измените раскрывающееся меню в верхнем левом углу страницы документов с 3.3 до 2.7.)


Если вам интересно, как Python знает, какие дефолты идут с такими аргументами, когда у него просто есть кортеж … он просто отсчитывает назад от конца (или первый из * , *args , **kwargs -что после этого переходит в __kwdefaults__ dict вместо). f.__defaults = (4, 5) установит значения по умолчанию для y и z в 4 и 5 и по умолчанию для x . Это работает, потому что вы не можете иметь параметры без дефолта после дефолтных параметров.


Есть случаи, когда это не сработает, но даже тогда вы можете неизменно скопировать его в новую функцию с разными значениями по умолчанию:

 >>> f2 = types.FunctionType(f.__code__, f.__globals__, f.__name__, ... (4, 5, 6), f.__closure__) 

Здесь документация модулей types самом деле ничего не объясняет, но help(types.FunctionType) в интерактивном интерпретаторе показывает необходимые вам параметры.


Единственный случай, с которым вы не можете справиться, – встроенная функция. Но у них вообще нет фактических дефолтов; вместо этого они подделывают что-то подобное в C API.

используйте func_defaults как в

 def myfun(a=3): return a myfun.func_defaults = (4,) b = myfun() assert b == 4 

проверьте документы для func_defaults здесь

ОБНОВЛЕНИЕ: глядя на ответ RiaD, я думаю, что я был слишком буквальным с моим. Я не знаю контекста, из которого вы задаете этот вопрос, но в целом (и, следуя Zen Python ), я считаю, что работа с частичными приложениями является лучшим вариантом, чем переопределение аргументов по умолчанию по умолчанию

  • Отображение значений в словаре python
  • сохранение несвязанных функций python в объекте класса
  • Что предпочтительнее использовать в Python: лямбда-функции или вложенные функции ('def')?
  • Python: передача функции с параметрами в качестве параметра
  • Python не может определить кортежи в функции
  • Может ли одна функция иметь несколько имен?
  • Возврат функции Python
  • Понимание стиля вызова by-by-Python передаваемых аргументов функции
  • Почему functools.partial не возвращает реальную функцию (и как ее создать)?
  • Мне не нравятся функции Python, которые принимают два или более итераций. Это хорошая идея?
  • Python - вывод из функций?
  • Python - лучший язык программирования в мире.