python - with `*args`, keyword arguments become positional? -
example, define function
def myfunc(a=1, *args): print(a) # *args have other functionality, example passed class instance, or whatever problem is: when calling myfunc, can't pass expected positional arguments *args first, pass keyword argument a. example, if expected *args contain number, can't
myfunc(3, a=4) this raise error, stating multiple assignments received a. can't myfunc(a=4, b=5, 3) obviously. can
myfunc(4, 3) so seems, *args, keyword argument a becomes positional?
the example here function, applies classes. subclass __init__(a=3, *args) wants keyword argument a , other 99 required arguments pass super. wouldn't want repeat 99 arguments definition in subclass, rather *args , pass super. keyword argument a becomes positional.
this class , subclass example real problem in coding. want subclass optional, keyword argument a, , 99 required arguments super. don't see good, clean way around problem.
i can't first bump this, couldn't find answer.
a isn't positional-only:
>>> import inspect >>> def myfunc(a=1, *args): ... print(a) >>> inspect.signature(myfunc).parameters['a'].kind <_parameterkind.positional_or_keyword: 1> and indeed can passed in keyword-argument:
>>> myfunc(a=4) 4 however, noted, want provide subsequent positional arguments, have provide positional parameter. has nothing *args, that's how positional arguments work:
>>> def myfunc2(a, b): ... print(a) >>> myfunc2(1, a=2) typeerror: myfunc2() got multiple values argument 'a' it either has first of positional arguments or arguments have passed name.
however *args complicates situation somewhat, because collects positional arguments. means if should collect anything have pass in previous parameters position.
but in case want roll own special case accept *args, **kwargs , first check if it's passed keyword (named) argument or, if not, first positional argument:
>>> def myfunc3(*args, **kwargs): ... if 'a' in kwargs: ... = kwargs.pop('a') ... else: ... = args[0] ... args = args[1:] ... print(a, args, kwargs) >>> myfunc3(1, a=2) 2 (1,) {} >>> myfunc3(2, 1) 2 (1,) {} that should give results expected need explicit in documentation how argument should passed in because breaks semantics of pythons signature model.
Comments
Post a Comment