Используйте аргументы одной функции в качестве аргументов для другой функции - PullRequest
0 голосов
/ 04 июня 2018

Предположим, у меня есть следующая функция

def f(x,y,**kwargs):
    if 'z' in kwargs:
        z = kwargs['z']
    else:
        z = 0
    print(x + y + z)

, которая принимает два аргумента и необязательный аргумент ключевого слова.Теперь я хочу получить функцию g, которая работает так же, как f, но для которой значение z предопределено.Следовательно, я мог бы сделать следующее

def g(x,y):
    z = 3 
    f(x,y, z = 3)

Но что я могу сделать, если я не знаю количество аргументов без ключевых слов, которое принимает f.Я могу получить список этих аргументов по

args = inspect.getargspec(f)[0]

Но, если теперь я определю g как

g(args):
    z = 3
    f(args, z=z)

, это, конечно, не сработает, так как только один обязательный аргумент передается в f,Как мне обойти это?То есть, если у меня есть функция, которая принимает аргументы ключевого слова, как мне определить вторую функцию точно так же, как ожидают, что аргументы ключевого слова принимают заранее определенные значения?

Ответы [ 2 ]

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

У вас есть несколько вариантов здесь:

  1. Определить g с varargs :

    def g(*args):
        return f(*args, z=3)
    

    Или, если вам нужно ключевое словоАргументы также:

    def g(*args, **kwargs):
        kwargs['z'] = 3
        return f(*args, **kwargs)
    
  2. Использование functools.partial:

    import functools
    
    g = functools.partial(f, z=3)
    

    См. также этот связанный вопрос: Аргумент PythonБиндеры .

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

Вы можете использовать functools.partial для достижения этого

import functools
f = functools.partial(f, z=2)

# the following example is the usage of partial function f
x = f(1, 2)
y = f(1, 2, k=3)
z = f(1, 2, z=4)
...