Cara Pythonic untuk menimpa argumen default dengan **kwargs?

Dengan fungsi f memanggil fungsi terkenal lainnya dengan Python (misalnya fungsi matplotlib), cara apa yang paling pythonic/efisien/elegan untuk mendefinisikan beberapa nilai default sambil tetap memberikan kemungkinan kepada pengguna f untuk sepenuhnya menyesuaikan fungsi yang dipanggil (biasanya dengan **kwargs), termasuk untuk menimpa argumen kata kunci default yang ditentukan dalam 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()

Di sini, panggilan terakhir ke f muncul:

TypeError: contourf() mendapat beberapa nilai untuk argumen kata kunci 'cmap'


person ztl    schedule 23.03.2018    source sumber


Jawaban (1)


Di pembungkus Anda, Anda cukup menyesuaikan kwargs sebelum meneruskannya ke fungsi yang dibungkus:

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

setdefault akan menghindari perubahan argumen jika diteruskan ke pembungkus Anda, tetapi Anda selalu dapat dengan mudah mengalahkannya jika Anda mau.

person SpoonMeiser    schedule 23.03.2018