使用** kwargs覆盖默认参数的Pythonic方法?

时间:2018-03-23 14:03:14

标签: python arguments

使用函数f调用Python中另一个众所周知的函数(例如matplotlib函数),定义一些默认值同时仍然提供可能性的最pythonic /有效/优雅方式是什么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的最后一次调用抛出:

  

TypeError:contourf()为关键字参数' cmap'

获取了多个值

1 个答案:

答案 0 :(得分:3)

在你的包装器中,你可以简单地调整kwargs,然后再将其传递给包装函数:

def f(ax, n=12, **kwargs):
    kwargs.setdefault('cmap', plt.cm.autumn)
    ax.contourf(x, y, z, n, **kwargs)
如果将参数传递给您的包装器,

setdefault将避免更改参数,但如果您愿意,您可以轻松地将其删除。