передача произвольных (неиспользованных) аргументов ключевых слов в matplotlib - PullRequest
0 голосов
/ 06 мая 2018

Я пишу небольшую функцию построения графиков, которая использует matplotlib, а затем вносит некоторые изменения на основе пользовательского ввода, предоставленного в ** kwargs.

Это не работает так, как я ожидал, потому что, если ключевое слово аргумента неизвестно в matplotlib (похоже на Artist.py), я получаю исключение.

Например:

import matplotlib.pyplot as plt
def invalid_mpl(**kwargs):
    fig, ax = plt.subplots()
    ax.plot([1,2,3], [-3, -2, -1], **kwargs)
    return fig, ax

Это прекрасно работает, если называется как

f0, a0 = invalid_mpl()

или с действительным kwarg как

f0, a0 = invalid_mpl(color='red')

но повышает AttributeError: Unknown property my_fake_kwarg для

f0, a0 = invalid_mpl(my_fake_kwarg=True)

Так что я думаю, мои вопросы: 1. Это ожидаемое поведение? 2. Есть ли способ проанализировать kwargs для правильных ключевых слов matplotlib?

1 Ответ

0 голосов
/ 27 июня 2018

Это ожидаемое поведение. Matplotlib не будет принимать неизвестные аргументы ключевых слов. Если сделать my_fake_kwarg явным аргументом ключевого слова, это не исправит ситуацию. С

def valid_mpl(my_fake_kwarg=None, **kwargs):
    do_something_with(my_fake_kwarg)
    fig, ax = plt.subplots()
    ax.plot([1,2,3], [-3, -2, -1], **kwargs)
    return fig, ax

valid_mpl(my_fake_kwarg=True) по-прежнему приводит к kwargs = {'my_fake_kwarg': True}.

Вы можете удалить его из kwargs после того, как с ним покончено.

def valid_mpl(**kwargs):
    fig, ax = plt.subplots()

    if 'my_fake_kwarg' in kwargs:
        del kwargs['my_fake_kwarg']

    ax.plot([1,2,3], [-3, -2, -1], **kwargs)
    return fig, ax

Или создайте новый словарь для распаковки в ax.plot.

def valid_mpl(**kwargs):
    fig, ax = plt.subplots()

    fake_kwargs = ['my_fake_kwarg']
    plot_kwargs = {k: v for k, v in kwargs.items() if k not in fake_kwargs}

    ax.plot([1,2,3], [-3, -2, -1], **plot_kwargs)
    return fig, ax
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...