¿Por qué este fragmento de código arroja un SyntaxError?
>>> def fun1(a="who is you", b="True", x, y):
... print a,b,x,y
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
Mientras el siguiente fragmento de código se ejecuta sin errores visibles:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Respuestas:
Todos los parámetros requeridos deben colocarse antes de cualquier argumento predeterminado. Simplemente porque son obligatorios, mientras que los argumentos predeterminados no lo son. Sintácticamente, sería imposible para el intérprete decidir qué valores coinciden con qué argumentos si se permitieran modos mixtos. Se
SyntaxError
genera A si los argumentos no se dan en el orden correcto:Echemos un vistazo a los argumentos de palabras clave, utilizando su función.
Supongamos que está permitido declarar la función como se indica arriba. Luego, con las declaraciones anteriores, podemos hacer las siguientes llamadas de argumentos posicionales o de palabras clave:
Cómo sugerirá la asignación de variables en la llamada a la función, cómo se utilizarán los argumentos predeterminados junto con los argumentos de palabras clave.
Referencia O'Reilly - Core-Python
Donde, como esta función, utiliza los argumentos predeterminados sintácticamente correctos para las llamadas a funciones anteriores. La invocación de argumentos de palabras clave resulta útil para poder proporcionar argumentos posicionales fuera de orden, pero, junto con los argumentos predeterminados, también se pueden usar para "omitir" los argumentos faltantes.
fuente
func1(x=1, y=2)
.**kwargs
que no se puede hacerdef fun1(a="who is you", b="True", x, y)
o trabajo similar. Si usadef f(**kwargs)
, ¿necesita manejar los valores predeterminados en el cuerpo?def fun1(a="who is you", b="True", x, y)
lo mismo se logra con un estilo diferente. if def fun1 (** kwrgs) `entonces llamefun1({'a': 'who is you', 'b': True})
sin necesidad de pasar x e y.def foo(x=None, y)
se permitiera. Así que todavía tengo curiosidad por qué Python no permite esto. ¿Existe una razón fundamental real o es simplemente "no lo permitimos porque no lo permitimos"?Si permitiera esto, los argumentos predeterminados se volverían inútiles porque nunca podría usar sus valores predeterminados, ya que los argumentos no predeterminados vienen después .
Sin embargo, en Python 3, puede hacer lo siguiente:
qué marca
x
yy
palabra clave solo para que pueda hacer esto:Esto funciona porque ya no hay ambigüedad. Tenga en cuenta que aún no puede hacerlo
fun1(2, 2)
(eso establecería los argumentos predeterminados).fuente
Déjame aclarar dos puntos aquí:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) son parámetros posicionales
(c = ninguno) es un parámetro opcional
(r = "w") es el parámetro de palabra clave
(d = []) es el parámetro de lista
(* ae) es solo palabra clave
(** ab) es el parámetro var-keyword
def example(a, b, c=a,d=b):
el argumento no se define cuando se guardan los valores predeterminados, Python calcula y guarda los valores predeterminados cuando define la función
cyd no están definidos, no existe, cuando esto sucede (existe solo cuando se ejecuta la función)
"a, a = b" no está permitido en el parámetro.
fuente
Los argumentos obligatorios (los que no tienen valores predeterminados) deben estar al principio para permitir que el código del cliente solo suministre dos. Si los argumentos opcionales estuvieran al principio, sería confuso:
¿Qué haría eso en tu primer ejemplo? En el último, x es "quién es quién", y es 3 y a = "jack".
fuente