Wenn ich eine Funktion mit vielen optionalen Argumenten habe

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

Und ich möchte einigen von ihnen den gleichen Wert geben

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

Gibt es eine kompaktere Möglichkeit, dies zu tun? Ich muss also nicht weiter kopieren = Wert und die Zeile ausfüllen.

Nach mehreren hilfreichen Antworten glaube ich, dass ich zu der Antwort gekommen bin, nach der ich gesucht habe:

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


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

Danke Jungs, tut mir leid, wenn ich schlecht erklären konnte, was ich brauchte.

-1
Ruler555 7 Feb. 2020 im 16:23

5 Antworten

Beste Antwort

Ich denke, was Sie tun möchten, ist das Entpacken von Schlüsselwortargumenten. Sie können der Funktion ein Wörterbuch übergeben, das die von Ihnen enthaltenen Argumente entpackt. Alles, was nicht enthalten ist, verwendet die Standardwerte.

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
James 7 Feb. 2020 im 13:44

Sie können Standardargumente verwenden:

def func(arg1, arg2, def_arg1="1", def_arg2="2"):
    pass
0
Zaven Zareyan 7 Feb. 2020 im 13:26

Wenn Sie diese Funktion nicht geschrieben haben und ihre Signatur nicht ändern können, können Sie die richtige Anzahl von Argumenten auf diese Weise übergeben:

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

Es wird der gleiche Wert (in diesem Fall 0) an alle Argumente übergeben, die die Funktion erwartet.

Wenn Sie beispielsweise nur 10 Argumente übergeben müssen, können Sie schreiben:

function_name(*(0,) * 10)

Wenn Sie bestimmte Argumente anhand ihrer Position und nicht anhand ihrer Namen ansprechen möchten, können Sie Folgendes verwenden:

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
znarf94 7 Feb. 2020 im 15:23

Wenn die Argumente, die denselben Wert haben sollen, zusammenhängend sind, dann:

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

function_name(2, *[1] * 3)

Drucke:

2 1 1 1
0
Booboo 7 Feb. 2020 im 13:41

Sie können einfach ** kwargs verwenden

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

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

Schauen Sie sich dies an und this

0
mzavarez 7 Feb. 2020 im 13:40