Pythonic способ перезаписать аргумент по умолчанию с помощью ** kwargs?

С функцией f, вызывающей другую известную функцию в Python (например, функцию matplotlib), каков наиболее питонический/эффективный/элегантный способ определить некоторые значения по умолчанию, при этом предоставляя пользователю f возможность полностью настроить вызываемую функцию. (обычно с **kwargs), в том числе для перезаписи аргументов ключевого слова по умолчанию, определенных в f?

import numpy as np
import matplotlib.pyplot as plt


v = np.linspace(-10.,10.,100)
x,y = np.meshgrid(v, v)
z = -np.hypot(x, y)

def f(ax, n=12, **kwargs):
    ax.contourf(x, y, z, n, cmap=plt.cm.autumn, **kwargs)

fig, ((ax0, ax1), (ax2, ax3)) = plt.subplots(2, 2)
f(ax0) # OK
f(ax1, n=100) # OK
f(ax2, n=100, **{'vmax': -2, 'alpha': 0.2}) # OK
# f(ax3, n=100, **{'cmap': plt.cm.cool}) # ERROR

plt.show()

Здесь последний вызов f выдает:

Ошибка типа: контурф() получил несколько значений для аргумента ключевого слова 'cmap'


person ztl    schedule 23.03.2018    source источник


Ответы (1)


В вашей оболочке вы можете просто настроить kwargs перед передачей ее в обернутую функцию:

def f(ax, n=12, **kwargs):
    kwargs.setdefault('cmap', plt.cm.autumn)
    ax.contourf(x, y, z, n, **kwargs)

setdefault будет избегать изменения аргумента, если он был передан вашей оболочке, но вы с таким же успехом всегда можете стереть его, если захотите.

person SpoonMeiser    schedule 23.03.2018