{"id":5421,"date":"2018-07-24T15:58:19","date_gmt":"2018-07-24T20:58:19","guid":{"rendered":"https:\/\/islascruz.org\/blog\/?p=5421"},"modified":"2018-07-26T18:14:12","modified_gmt":"2018-07-26T23:14:12","slug":"lo-nuevo-en-python-3-7","status":"publish","type":"post","link":"https:\/\/islascruz.org\/blog\/2018\/07\/24\/lo-nuevo-en-python-3-7\/","title":{"rendered":"Lo nuevo en Python 3.7"},"content":{"rendered":"<p>Python, continua con su desarrollo y aunque en la versi\u00f3n 2.7 ya no tiene grandes cambios si que lo tiene en la versi\u00f3n 3, en esta ocasi\u00f3n la versi\u00f3n 3.7 que incluye una cuantas cositas que si que valen la pena mencionar.<\/p>\n<p><!--more--><\/p>\n<p>[amazon_link asins=&#8217;1977921752,1783551313,B018T6ZVPK&#8217; template=&#8217;ProductCarousel&#8217; store=&#8217;launocom-20&#8242; marketplace=&#8217;MX&#8217; link_id=&#8217;db881ca5-9128-11e8-8132-31ef3fc14c8a&#8217;]<\/p>\n<h3>Breakpoints ahora est\u00e1n dentro de builtins.<\/h3>\n<p>Cuando queremos depurar c\u00f3digo y no estamos usando un IDE o queremos hacerlo &#8220;a manita&#8221; recurrimos a <code>pdb<\/code>\u00a0y <code>set_trace()<\/code>\u00a0, que tenemos que importarlo y despu\u00e9s invocarlo, es f\u00e1cil pero no llega a ser tan pr\u00e1ctico como \u00a0<code>print()<\/code>\u00a0, por eso muchos prefieren llenar de <code>print<\/code>\u00a0su c\u00f3digo.<\/p>\n<p>Ahora con breakpoints es f\u00e1cil crear un punto donde la ejecuci\u00f3n del programa se detenga para la depuraci\u00f3n, sin necesidad de hacer un import primero y despu\u00e9s, una vez que hemos terminado de depurar, \u00a0quitarlo.<\/p>\n<pre>def adivina(numero):\n    adivinado = input(\"advina el numero\")\n    breakpoint()\n    if numero == adivinado:\n         return \"Exito!\"\n    return \"Nope\"\n\n<\/pre>\n<p>El resultado es b\u00e1sicamente igual que si llam\u00e1ramos <code>pdb.set_trace()<\/code>\u00a0pero de nuevo, sin importar nada ni quitar mas que el breakpoint.<\/p>\n<h3>Anotaciones y tipado de datos<\/h3>\n<p>Python se ha notado por mucho tiempo en que las funciones\/m\u00e9todos no tienen un tipado duro, bueno, sigue siendo, pero si quieres hacer un tipado ahora lo puedes hacer. Para esto al definir tus par\u00e1metros pondr\u00e1s dos puntos y seguido el tipo de dato que se espera.<\/p>\n<pre>def adivina(numero: int):<\/pre>\n<p>Adicional a esto, puedes decir que tipo de valor devolver\u00e1 la funci\u00f3n\/m\u00e9todo, para esto, despu\u00e9s de la definici\u00f3n de tu funci\u00f3n, antes de los dos puntos, pones un guion y mayor que <code>-&gt;<\/code>\u00a0 y el tipo de dato que se devolver\u00e1.<\/p>\n<pre>def adivina(numero: int) -&gt; str:<\/pre>\n<p>Como podemos ver, <code>advina<\/code>ahora indica que devolver\u00e1 una cadena. Esto nos ayudar\u00e1 en los IDEs que detecten este tipo de errores directamente mientras escribimos, evit\u00e1ndonos problemas en tiempo de ejecuci\u00f3n.<\/p>\n<p><strong>Que pasa si el tipo de dato es el mismo de la clase ?.<\/strong><\/p>\n<p>La soluci\u00f3n son anotaciones, veamos este ejemplo:<\/p>\n<pre>class User:\n    def __init__(self, user: str, prev_user: User) -&gt; None:<\/pre>\n<p>En este ejemplo no podemos indicar que el tipo de dato de <code><\/code>\u00a0es <code>User<\/code>\u00a0puesto que no est\u00e1 definido a\u00fan. Para esto tendremos que importar <code>annotations<\/code>\u00a0de <code>__future__<\/code>\u00a0. Esto se tiene que hacer as\u00ed para mantener la compatibilidad a codigo escrito previamente.<\/p>\n<pre>from __future__ import annotations\n\nclass User:\n    def __init__(self, user: str, prev_user: User) -&gt; None:<\/pre>\n<h3>Nanosegundos en Time<\/h3>\n<p><code>time<\/code> \u00a0tiene nuevas funciones, ahora cada funci\u00f3n de <code>time<\/code>\u00a0tiene su funci\u00f3n correspondiente en nanosegundos, por ejemplo, <code>time.time()<\/code>\u00a0tiene su correspondiente <code>time.time_ns()<\/code>\u00a0que agrega la resoluci\u00f3n de nanosegundos.<\/p>\n<h3>Mas r\u00e1pido<\/h3>\n<p>Hablando de tiempos, Python es mas r\u00e1pido, las optimizaciones son a bajo nivel por lo que nose ahondara aqu\u00ed, pero en general, es 10% mas r\u00e1pido en Linux, 30% mas r\u00e1pido en macOS y en t\u00e9rminos generales las funciones ser\u00e1n un 20% mas r\u00e1pidas.<\/p>\n<h3>Dataclases<\/h3>\n<p>Es com\u00fan que escribamos el inicializador solo para asignar unas variables a la clase:<\/p>\n<pre>class User:\n    def __init__(self, name: str, age: int) -&gt; None:\n        self.name = name\n        self.age = age\n\n    def is_adult(self) -&gt; bool:\n        return self.age &gt; 18\n\nu = User(\"Marco\", 34)\nu.is_adult()\nTrue\n\n<\/pre>\n<p>Dataclases nos ahorra este trabajo, para esto tendremos que decorar la clase con <code>@dataclass<\/code><\/p>\n<pre>@dataclass\nclass User:\n    name: str\n    age: int\n\n    def is_adult(self) -&gt; bool:\n        return self.age &gt; 18\n\n\nu = User(\"Marco\", 34)\nu.is_adult()\nTrue\n\n<\/pre>\n<p>[amazon_link asins=&#8217;B00D2XIU9A,B000MQAPPC,B019PHO23E&#8217; template=&#8217;ProductCarousel&#8217; store=&#8217;launocom-20&#8242; marketplace=&#8217;MX&#8217; link_id=&#8217;65954cfe-9129-11e8-be3e-47fbd44d5426&#8242;]<\/p>\n<h3>Otros cambios:<\/h3>\n<ul>\n<li>Los diccionarios ahora respetan el orden en que fueron insertados los datos, por lo tanto un diccionario remplazar\u00e1 en casi todos los casos a <code>collections.OrderedDict<\/code>\u00a0.<\/li>\n<li>Documentation en Frances, Coreano y Japon\u00e9s<\/li>\n<li>Control del contenido del m\u00f3dulo puesto que <code>__getattr__<\/code>ahora puede ser definido a nivel de m\u00f3dulo.<\/li>\n<li>Un nuevo <a href=\"https:\/\/docs.python.org\/3\/using\/cmdline.html#id5\" target=\"_blank\" rel=\"noopener\">modo developer para cPython<\/a>.<\/li>\n<li>Los archivos .pyc son deterministicos, es decir, cada ejecuci\u00f3n crear\u00e1 exactamente el mismo .pyc byte por byte.<\/li>\n<\/ul>\n<p>Mas informaci\u00f3n en las notas de liberaci\u00f3n de <a href=\"https:\/\/www.python.org\/downloads\/release\/python-370\/\" target=\"_blank\" rel=\"noopener\">Python 3.7<\/a><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5421\" class=\"pvc_stats all  \" data-element-id=\"5421\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/islascruz.org\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Python, continua con su desarrollo y aunque en la versi\u00f3n 2.7 ya no tiene grandes cambios si que lo tiene en la versi\u00f3n 3, en esta ocasi\u00f3n la versi\u00f3n 3.7 que incluye una cuantas cositas que si que valen la pena mencionar.<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5421\" class=\"pvc_stats all  \" data-element-id=\"5421\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/islascruz.org\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":1267,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,14,15],"tags":[],"class_list":["post-5421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-espanol","category-programming","category-python"],"a3_pvc":{"activated":true,"total_views":28587,"today_views":0},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/comments?post=5421"}],"version-history":[{"count":6,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5421\/revisions"}],"predecessor-version":[{"id":5445,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5421\/revisions\/5445"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media\/1267"}],"wp:attachment":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media?parent=5421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/categories?post=5421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/tags?post=5421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}