Используя один и тот же словарь в качестве аргумента для различных функций, некоторые имеют меньше аргументов

1

У меня есть несколько функций, которые берут целую кучу тех же аргументов. У некоторых из них есть дополнительные аргументы. Я бы хотел передать один и тот же словарь в них, но те, у кого меньше аргументов, будут жаловаться на дополнительные элементы в словаре.

Какое лучшее решение? Поместить бесполезные фиктивные параметры в функции с меньшим количеством аргументов?

Теги:
dictionary
arguments
parameters

1 ответ

1
Лучший ответ

Сделайте простой декоратор, который будет использовать модуль inspect для получения списка параметров функции. Это даст вам пример:

import inspect

def take_many_arguments(fn):
    origf = fn
    def _f(*arg, **args):
        new_args = {}

        for a in inspect.getargspec(origf).args:
            if a not in args:
                continue
            new_args[a] = args[a]

        return origf(*arg, **new_args)
    return _f


class C:
    @take_many_arguments
    def fn1(self, a):
        print(a)

    @take_many_arguments
    def fn2(self, a, b):
        print(a, b)

    @take_many_arguments
    def fn3(self, a, b, c):
        print(a, b, c)


@take_many_arguments
def fn4(a, b):
    print(a, b)


d = {'a': 1, 'b': 2, 'c': 3}

# for classes:
c = C()
c.fn1('Normal call')
c.fn1(**d)
c.fn2(**d)
c.fn3(**d)

# for functions:
fn4(9, 8)
fn4(**d)

Выход:

Normal call
1
1 2
1 2 3
9 8
1 2
  • 0
    Мне это очень нравится. Одной из проблем, однако, является то, что он не позволяет передавать какие-либо позиционные аргументы в декорированную функцию, потому что args[a] завершится ошибкой для этого параметра (этот параметр находится внутри arg ). Так, например, если я хочу использовать это внутри класса, у меня будут проблемы с параметром self . Единственный способ избежать этого - добавить if not a == 'self' между строкой for a строкой new_args[a] = . Ты так справишься?
  • 1
    @EricAuld Да, теперь код ответа должен работать даже для классов. Я изменил пример в ответе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню