Python передает разные ** kwargs для нескольких функций

Из python doc и stackoverflow я понимаю, как использовать ** kwargs в моей функции def. Тем не менее, мне нужно два набора ** kwargs для двух подфункций. Может ли кто-нибудь показать мне, как правильно отделить ** kwargs?

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

def smoothy(x,y, kind='cubic', order = 3, **kwargs_for_scatter, **kwargs_for_plot):
    yn_cor = interp1d(x, y, kind=kind, assume_sorted = False)
    xn = np.linspace(np.min(x), np.max(x), len(x) * order)
    plt.scatter(x,y, **kwargs_for_scatter)
    plt.plot(xn, yn_cor(xn), **kwargs_for_plot);
    return

Спасибо за помощь.

+6
источник поделиться
1 ответ

Нет такого механизма. Существует предложение PEP-448, в котором Python 3.5 и последующее обобщение аргумента распаковывают. Python 3.4 и предыдущие не поддерживают его. Лучшее, что вы можете сделать в целом:

def smoothy(x,y, kind='cubic', order = 3, kwargs_for_scatter={}, kwargs_for_plot={}):
    yn_cor = interp1d(x, y, kind=kind, assume_sorted = False)
    xn = np.linspace(np.min(x), np.max(x), len(x) * order)
    plt.scatter(x,y, **kwargs_for_scatter)
    plt.plot(xn, yn_cor(xn), **kwargs_for_plot);
    return

Затем передайте эти параметры в виде словарей, а не kwargs, в smoothy.

smoothy(x, y, 'cubic', 3, {...}, {...})

Так как имена переменных будут, возможно, подвержены вызовам, вы можете переименовать их в нечто более короткое (возможно, scatter_options и plot_options).

Обновление: Python 3.5 и 3.6 теперь являются основными, и они действительно поддерживают расширенный синтаксис распаковки, основанный на PEP-448.

>>> d = {'name': 'joe'}
>>> e = {'age': 20}
>>> { **d, **e }
{'name': 'joe', 'age': 20}

Однако это не помогает в сценарии kwargs-предназначено для нескольких мест. Даже если функция smoothy() взяла единый захватный пакет кваргов, вам нужно будет определить, какие из них предназначены для каких-либо подфункций. Мессия в лучшем случае. Множественные параметры dict, которые должны быть переданы каждой подфункции kwarg-принятия, по-прежнему являются наилучшим подходом.

+6
источник

Посмотрите другие вопросы по меткам или Задайте вопрос