00:00Este video va a hablar de la nueva característica de argumentos de sólo posición. Voy a tener que empezar con un ejemplo. Quiero empezar este vídeo hablando de una función incorporada llamada float().

00:09float() se puede utilizar para convertir cadenas de texto o números a objetos float, así. Si traes la función help() sobre la función incorporada float, si miras la firma de float justo aquí, notarás que hay una barra (/) después del parámetro. ¿Qué significa esto? Bueno, resulta que hay un parámetro de float() y se llama x, y no se permite usar el nombre del parámetro al llamarlo. Cuando se utiliza float(), se permite especificar los argumentos sólo por la posición, no por una palabra clave. Déjame mostrarte lo que quiero decir. De nuevo, fíjate en la barra (/) aquí. Presionando q para salir de help(). Así que si intentas float() de nuevo y dices x="3.8"-una cadena de texto-verás aquí que dice float() takes no keyword arguments, sólo este argumento posicional.

00:53No puedes usar una palabra clave cuando especificas el argumento. Antes de Python 3.8, no había una forma fácil de especificar que los argumentos debían ser sólo posicionales en tus propias funciones. Así que si fueras a definir algo como esta función-la llamaremos incr() (incremento).

01:10Cuando llamas a incr(), y digamos que le das un float, podrías usar cualquier método, y eso es normal para un argumento regular. Y ahí es donde viene el cambio en Python 3.8.

01:24Podrías reescribir la función de incremento incr() para que acepte argumentos sólo posicionales. Se vería más como esto, con una coma (,) y luego una barra (/), y el resto es el mismo.

01:40Así que cuando se llama a incr(), que funciona bien. Pero si ahora usaras la palabra clave, ocurre algo nuevo. Aquí dice incr() got some positional-only arguments passed as keyword arguments.

01:55Así que eso lanzará una excepción y te dará un TypeError. Puedes usar esto casi como un divisor entre tus argumentos sólo posicionales y los argumentos regulares. Permítame que lo pruebe con otro ejemplo.

02:07Defina una nueva función llamada greet(). greet() va a tomar un name como argumento de sólo posición, entonces vas a poner esa barra (/) allí para que puedas combinar argumentos de sólo posición con argumentos regulares. Así que aquí hay un argumento regular de un greeting.

02:23Aquí vas a devolver una cadena f con el greeting. Si aún no has trabajado con cadenas f, incluiré un enlace en el texto de abajo a artículos y cursos sobre ello.

02:31Coma, espacio, el name. Así que cuando llames a greet() -de nuevo, el greeting por defecto va a ser "Hello".

02:37Vas a introducir aquí el name como sólo posicional.

02:43Genial. También podrías llamar a greet()

02:49y darle un greeting.

02:55Pero lo que no puedes hacer-o te dará un error-es que si escribes name,

03:08aquí obtendrás una excepción de un TypeError. De nuevo, al igual que en el anterior para incr(), greet() tiene algunos argumentos posicionales pasados como argumentos de palabra clave, específicamente name. A primera vista, los argumentos posicionales pueden parecer un poco limitantes y contrarios al mantra de Python sobre la importancia de la legibilidad.

03:26Probablemente encontrarás que no hay muchas ocasiones en las que los argumentos sólo posicionales mejoren tu código. Sin embargo, en las circunstancias adecuadas, puede darte cierta flexibilidad cuando diseñes funciones.

03:35En primer lugar, los argumentos de sólo posición tienen sentido cuando tienes argumentos que tienen un orden natural pero son difíciles de dar buenos nombres descriptivos. Otro beneficio de usar argumentos de sólo posición es que puede refactorizar más fácilmente sus funciones-en particular, puede cambiar el nombre de sus parámetros sin preocuparse de que otro código dependa de esos nombres.

03:57Para repetir esa información, ¿cómo se especifican los argumentos de sólo posición? Se utiliza la barra oblicua (/) para denotar que los argumentos anteriores deben ser especificados por posición. Para aprender más sobre la anotación de la barra, PEP 457 proporciona una discusión en profundidad sobre ella. PEP 570 se sumerge mucho más en los parámetros de sólo posición de Python. Los enlaces a ambos están en el texto debajo de este vídeo.

04:20El complemento a los argumentos de sólo posición serían los argumentos de sólo palabra clave, y esos están disponibles en cualquier versión de Python 3. Puedes especificar que quieres argumentos de sólo palabra clave usando un asterisco (*).

04:31Cualquier argumento después de ese * debe ser especificado usando una palabra clave. Aquí hay un ejemplo de conversión a Fahrenheit, y puedes ver aquí que tiene un argumento de palabra clave celsius.

04:46Déjame probar esa función. Así que aquí, para especificar la palabra clave sólo, usted pone un * y luego poner el argumento de la palabra clave después-en este caso, celsius. Y en este caso, return

05:0232 + celsius * 9 / 5. Así que aquí, si usted llamara a to_fahrenheit() y sólo le diera un valor, digamos 40 grados Celsius, aquí dice que takes 0 positional arguments but 1 was given.

05:16Así que se requiere que usted tenga una palabra clave allí con el fin de llamarlo correctamente. Y también, dependiendo de sus circunstancias, puede querer combinar argumentos de sólo posición, regulares y de sólo palabra clave. Para hacer eso, los especificaría separados por esa barra (/) y el asterisco (*).

05:35Así que se vería algo así. Aquí, una posición de text, la barra (/). Aquí, el argumento estándar.

05:46Y ahora, después de la border, usando la *, el argumento de width, que tiene un valor por defecto de 50.

05:54Estás devolviendo una cadena f con un espacio delante del valor del argumento text y luego otro espacio. Y luego estás usando el método de cadena de texto de .center() con dos parámetros que estás tomando de esos argumentos, width y border.

06:08El único que es posicional es text. Podrías empezar con headline() y decir "Positional-only".

06:18Aquí, puedes ver el valor por defecto que va a ser ese tipo de borde con un width de 50, pareciendo algo así. De nuevo, como es sólo posicional, si le dieras text,

06:35eso daría un error, un TypeError. Para border, es un argumento regular. Así que en este caso, usted podría decir sólo un valor, digamos como, el signo de igualdad ("=") en su lugar.

06:49O usted podría realmente especificar que border es igual, digamos, a dos puntos (:). Se aceptará cualquiera de los dos estilos. Pero el width debe ser especificado usando una palabra clave si vas a introducirlo…

07:07sobrepasando el valor por defecto con un valor de 38.

07:15Si le dieras sólo el valor de 38, eso de nuevo lanzaría una excepción, obteniendo un TypeError: headline() takes 1 to 2 positional arguments but 3 were given. Así que, de nuevo, ese debe ser un argumento de palabra clave.

07:29Así que, como puedes ver, los argumentos sólo posicionales pueden complementar muy bien los argumentos regulares y los argumentos sólo de palabra clave. En el siguiente vídeo, aprenderás cómo Python 3.8 mejora la comprobación de tipos utilizando tipos más precisos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.