Argumento posicional vs argumento de palabra clave

81

Basado en esto

Un argumento posicional es un nombre que no va seguido de un signo igual (=) y un valor predeterminado.

Un argumento de palabra clave va seguido de un signo igual y una expresión que da su valor predeterminado.

def rectangleArea(width, height):
    return width * height

print rectangleArea(width=1, height=2)

Pregunta > Supongo que ambos widthy heightson argumentos posicionales. Entonces, ¿por qué también podemos llamarlo con la sintaxis de argumento de palabra clave?

q0987
fuente
1
"¿Por qué también podemos llamarlo con sintaxis de argumento real de palabra clave?" Porque así funciona el idioma.
S.Lott

Respuestas:

152

Ese texto que cita es para la definición de la función y no tiene nada que ver con las llamadas a la función. En la llamada a esa función, estás usando la función "argumento con nombre". Ese enlace que proporciona no es de muy buena calidad, los autores parecen confundidos entre dos cosas diferentes.

La referencia de Python se refiere a argumentos posicionales y de palabras clave solo con respecto a una llamada a una función (consulte la sección5.3.4 Calls ).

Cuando hablan de la definición de una función en la sección7.6 Function definitions , es un término totalmente diferente "valores de parámetros predeterminados".

Sospecho que las personas que crearon ese material de curso no estaban totalmente familiarizadas con Python :-)


A modo de ejemplo, consulte la siguiente definición y llamadas:

def fn (a, b, c = 1):          # a/b required, c optional.
    return a * b + c

print fn (1, 2)                # returns 3, positional and default.
print fn (1, 2, 3)             # returns 5, positional.
print fn (c = 5, b = 2, a = 2) # returns 9, named.
print fn (b = 2, a = 2)        # returns 5, named and default.
print fn (5, c = 2, b = 1)     # returns 7, positional and named.
print fn (8, b = 0)            # returns 1, positional, named and default.

El significado de los =cambios, dependiendo de si está en la definición o en la llamada.

En la definición, marca el argumento como opcional y establece un valor predeterminado.

En la llamada, simplemente le permite especificar qué argumentos deben ser qué valores, en el orden que desee.

paxdiablo
fuente
36

Dado que Python 3.8 introdujo solo argumentos posicionales, esta publicación necesita una actualización.

Los argumentos posicionales, los argumentos de palabras clave, los argumentos obligatorios y los opcionales a menudo se confunden. Los argumentos posicionales NO SON LOS MISMOS QUE los argumentos obligatorios. y los argumentos de palabras clave NO SON LOS MISMOS QUE los argumentos opcionales.

Argumentos posicionales son argumentos que se pueden llamar por su posición en la definición de la función.

Argumentos de palabras clave son argumentos que se pueden llamar por su nombre.

Argumentos requeridos son argumentos que se deben pasar a la función.

Los argumentos opcionales son argumentos que no se pueden pasar a la función. En python, los argumentos opcionales son argumentos que tienen un valor predeterminado .

Argumento posicional que es opcional (Python 3.8)

def f(a=2, /):
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Argumento posicional que se requiere (Python 3.8)

def f(a, /):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Argumento de palabra clave que es opcional

def f(*, a=1):
    pass


f()  # Allowed
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

argumento de palabra clave que se requiere

def f(*, a)
    pass


f()  # Error, argument required
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

Argumento posicional y de palabra clave que es opcional

def f(a=1)
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a=1, /):
    pass

Argumento posicional y de palabra clave que se requiere

def f(a):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a, /):
    pass

Conclusión, un argumento puede ser opcional o obligatorio, no ambos al mismo tiempo . También puede ser posicional, palabra clave o ambas al mismo tiempo .

Python 3.8 introdujo parámetros solo posicionales .

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass
Nazime Lakehal
fuente
¿Quiso decir en f(/,a,*)lugar de f(*, a, /)en sus dos últimos ejemplos?
Jagerber48
21

Un argumento de palabra clave es solo un argumento posicional con un valor predeterminado. Debe especificar todos los argumentos que no tienen un valor predeterminado. En otras palabras, los argumentos de palabras clave son solo "opcionales" porque se establecerán en su valor predeterminado si no se proporcionan específicamente.

chroipahtz
fuente
Está bien, eso tiene sentido, pero ¿puede explicar más por qué se llama argumento de "palabra clave"? Sé que el argumento "posicional" significa que su posición importa cuando llamas a la función.
NoName
3

Los argumentos posicionales se pueden llamar usando valores en orden o nombrando cada uno. Por ejemplo, los tres siguientes funcionarían de la misma manera:

def rectangleArea(width, height):
    return width * height

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))
David Robinson
fuente
No creo que esto sea correcto. Según el glosario oficial de Python aquí , el argumento posicional es un argumento que no es un argumento de palabra clave. La definición del argumento de palabra clave es un argumento precedido por un identificador (por ejemplo name=) en una llamada de función o pasado como un valor en un diccionario precedido por **. Estas dos definiciones contradicen su ejemplo.
Rafael
1

Argumentos posicionales: argumentos pasados ​​a una función en el orden posicional correcto. el siguiente programa comprende los argumentos posicionales de una función

#positional arguments example
def combine(str1, str2):
#To join str1 and str2 with str3
    str3 = str1 + str2
    print(str3)

#call combine() and pass 2 strings
combine("Well", "come")   #positional arguments 

Supongamos que pasamos primero por 'ven', 'bueno' en segundo lugar, luego el resultado vendrá bien. Además, llamar a la función 3 cadenas se convierten en error.

Karthik Sivaraman
fuente
0

Comprender los argumentos de palabras clave de una función.

Los argumentos de palabras clave son argumentos que identifican los parámetros por sus nombres.

#keyword arguments example: 
def employee(name, Id):
    print("Employee Name: ", name)
    print("Employee Id  : ", Id)
#call employee() and pass 2 arguments
employee(name = "inban", Id = "pay001")
employee(Id = "pay002", name = "karthik") #we can change the order args.
Karthik Sivaraman
fuente
0

Definir parámetros y argumentos aquí podría ayudar.

  1. Parámetro: una entidad nombrada en la definición de función / método que especifica un argumento.
  2. Argumento: un valor que se pasa a una función.

Por ejemplo,

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

Ahora, cuando dice argumento posicional, está hablando de argumentos , por lo que no tiene nada que ver con la definición de la función. widthy heighten su ejemplo son parámetros posicionales o parámetros de palabras clave (los llamados parámetros posicionales o de palabras clave).

La forma en que está llamando / pasando el valor a la función determina si son argumentos posicionales o argumentos de palabra clave .

rectangleArea(1, 2) # positional arguments
rectangleArea(width=1, height=2) # keyword arguments

Lo que no mucha gente sabe es que puede especificar un parámetro solo posicional utilizando /en la lista de parámetros (ejemplo de aquí ).

def func(positional_only1, positional_only2, /, positional_or_keyword): ...

De manera similar, también puede tener parámetros de solo palabras clave usando el *carácter.

def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...

Finalmente, también tenemos var-positional y var-keyword (también conocidos como * args y ** kwargs respectivamente). Es decir, puede tener una secuencia arbitraria de argumentos posicionales o argumentos de palabras clave pasados ​​a la función.

Rafael
fuente