Передача больше kwargs в функцию, чем первоначально установленная

Есть ли способ отправить больше kwargs в функцию, чем вызвано в вызове функции?

Пример:

def mydef(a, b):
    print a
    print b

mydict = {'a' : 'foo', 'b' : 'bar'}
mydef(**mydict)    # This works and prints 'foo' and 'bar'

mybigdict = {'a' : 'foo', 'b' : 'bar', 'c' : 'nooooo!'}
mydef(**mybigdict)   # This blows up with a unexpected argument error

Есть ли способ пройти через mybigdict без ошибки? 'c' никогда не будет использоваться в mydef в моем идеальном мире и будет просто проигнорирован.

Спасибо, мой рытье не придумал то, что я ищу.

Изменить: немного исправил код. mydef(a, b, **kwargs) была формой, которую я искал, но аргумент проверки функции args был для меня новой вещью и определенно чем-то для моего инструментария. Спасибо всем!

+7
источник поделиться
2 ответа

Чтобы разъяснить Мартин Пайтерс ответ (ради ясности). Возможно, если вы измените сигнатуру функции на:

def mydef(a, b, **kwargs):

Это означает, что это невозможно без изменения подписи. Но если это не проблема, это сработает.

+8
источник

Нет, если определение функции не позволяет больше параметров (используя синтаксис **kwargs catch-all), вы не можете вызвать метод с большим количеством аргументов, чем он определил.

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

import inspect

mybigdict = {'a2' : 'foo', 'b2' : 'bar', 'c2' : 'nooooo!'}
argspec = inspect.getargspec(mydef)
if not argspec.keywords:
    for key in mybigdict.keys():
        if key not in argspec.args:
            del mybigdict[key]
mydef(**mybigdict)

Я использую функцию inspect.getargspec(), чтобы проверить, поддерживает ли вызываемый метод **kwarg catch-all через .keywords, и Если это не так, я использую информацию .args для удаления всего, что метод не поддерживает.

+16
источник

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