Компактный способ передачи одинакового значения аргументам - PullRequest
0 голосов
/ 07 февраля 2020

Когда у меня есть функция с кучей необязательных аргументов

def function_name(arg1=0, arg2=0, arg3=0, arg4=0, ...):
      .....doing anything

и я хочу передать одно и то же значение некоторым из них

function_name(arg1=1, arg3=1, arg6=1)

Есть ли более компактный способ сделать Это? так что мне не нужно продолжать копировать = значение и заполнять строку.

После нескольких полезных ответов я думаю, что пришел к ответу, который искал:

def myargs(value, *args):
    kargs = {}
    for arg in args:
        kargs[arg] = value
    return kargs


function_name(**myargs(1, 'arg1', 'arg3', 'arg6'))

Спасибо, ребята извините, если я плохо объяснил, что мне нужно.

Ответы [ 5 ]

0 голосов
/ 07 февраля 2020

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

function_name(*(0,) * function_name.__code__.co_argcount)

Она передаст то же значение (в этом случае от 0) до всех аргументов, ожидаемых функцией.

Если вам нужно передать только 10 аргументов, например, вы можете написать:

function_name(*(0,) * 10)

Если вы хотите указать конкретные c аргументы по их позиции, а не по их именам, вы можете использовать это:

import inspect


def func(a, b, c=None, d='foo', e=False):
    print(a, b, c, d, e)


def fill_args(fun, value, arg_numbers):
    return {
        name: value
        for name in (
            tuple(inspect.signature(fun).parameters)[i]
            for i in arg_numbers
        )
    }


if __name__ == '__main__':
    func(**fill_args(func, 0, (0, 1, 2)))
    func(**fill_args(func, 'bar', (0, 1, 4)))
    func(**fill_args(func, True, (0, 1, 3)))
0 голосов
/ 07 февраля 2020

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

def test(w=0, x=0, y=0, z=0):
    return w+x+y+z

kwargs_1 = {'y': 1}
kwargs_2 = {'x': 2, 'z': 3}

test(**kwargs_1)
# returns:
1
test(**kwargs_2)
# returns:
5
0 голосов
/ 07 февраля 2020

Вы можете просто использовать ** kwargs

def function_name(arg, argOpt1=0, argOpt2=0, **kwargs):
    pass

kwargs = {"argOpt1" : 123, "argOpt2" : 234} 
function_name('argument1', kwargs)

Посмотрите на это и это

0 голосов
/ 07 февраля 2020

Если аргументы, которые должны иметь одинаковое значение, являются смежными, то:

def function_name(arg1=0,arg2=0,arg3=0,arg4=0):
    print(arg1, arg2, arg3, arg4)

function_name(2, *[1] * 3)

Печать:

2 1 1 1
0 голосов
/ 07 февраля 2020

Вы можете использовать аргументы по умолчанию:

def func(arg1, arg2, def_arg1="1", def_arg2="2"):
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...