Los extraños argumentos de rango.

La función de rango en python3 toma tres argumentos, dos de ellos son opcionales. Así que la lista de argumentos se parece a

[inicio], parada, [paso]

así que esto significa (corríjame si me equivoco) hay un argumento opcional antes de un argumento no opcional. Pero si bash definir una función como esta, obtengo esto:

>>> def foo(a = 1, b, c = 2): print(a, b, c) SyntaxError: non-default argument follows default argument 

¿Es esto algo que no puedo hacer como usuario “normal” de Python, o puedo definir esa función de alguna manera? Por supuesto que podría hacer algo como

 def foo(a, b = None, c = 2): if not b: b = a a = 1 

pero, por ejemplo, la función de ayuda mostraría información extraña. Así que realmente quiero saber si es posible definir una función como la anterior (la primera).

    range() toma 1 argumento posicional y dos argumentos opcionales, e interpreta estos argumentos de manera diferente según la cantidad de argumentos que ingresó.

    Si solo se pasó un argumento, se supone que es el argumento de stop , de lo contrario, el primer argumento se interpreta como el inicio.

    En realidad, el range() , codificado en C , toma un número variable de argumentos. Podrías emular eso así:

     def foo(*params): if 3 < len(params) < 1: raise ValueError('foo takes 1 - 3 arguments') elif len(params) == 1 b = params[0] elif: a, b = params[:2] c = params[2] if len(params) > 2 else 1 

    pero también puedes intercambiar argumentos:

     def range(start, stop=None, step=1): if stop is None: start, stop = 0, start 

    range no tiene argumentos de palabras clave:

     range(start=0,stop=10) TypeError: range() takes no keyword arguments 

    toma 1, 2 o 3 argumentos posicionales, se evalúan de acuerdo a su número:

     range(stop) # 1 argument range(start, stop) # 2 arguments range(start, stop, step) # 3 arguments 

    es decir, no es posible crear un rango con stop y step definidos y step start predeterminado.

     def foo(first, second=None, third=1): if second is None: start, stop, step = 0, first, 1 else: start, stop, step = first, second, third