{"id":5426,"date":"2018-07-25T12:12:30","date_gmt":"2018-07-25T17:12:30","guid":{"rendered":"https:\/\/islascruz.org\/blog\/?p=5426"},"modified":"2019-08-09T15:56:06","modified_gmt":"2019-08-09T20:56:06","slug":"buenas-practicas-en-python","status":"publish","type":"post","link":"https:\/\/islascruz.org\/blog\/2018\/07\/25\/buenas-practicas-en-python\/","title":{"rendered":"Buenas pr\u00e1cticas en Python"},"content":{"rendered":"<p>Programar es divertido, sobre todo si tienes a tus manos el lenguaje de programaci\u00f3n y otras herramientas de tu elecci\u00f3n, sin embargo, a veces cometemos errores que bien f\u00e1cil podemos evitar si seguimos estas buenas pr\u00e1cticas.<\/p>\n<p><!--more--><\/p>\n<h3>Usa un editor de c\u00f3digo con buen soporte para Python<\/h3>\n<p>La mayor\u00eda de los editores de texto tienen soporte para Python, pero unos tienen mas que otros. Algunos son extensibles gracias a plug-ins, otros traen todo incluido. Sin embargo es bueno que le dediques un tiempo a buscar el mejor para tus necesidades.<\/p>\n<p>Por ejemplo, para una edici\u00f3n r\u00e1pida yo ocupo normalmente VIM. es mi editor de texto favorito y gracias a la cantidad de plugins que tiene puedes extender su uso para Python. \u00a0Me gusta mucho que puedo crear codigo y correrlo en corto dentro de vim sin crear realmente un archivo.<\/p>\n<p>[KGVID]https:\/\/islascruz.org\/blog\/wp-content\/uploads\/2018\/07\/Screeny-Video-Jul-24-2018-at-4.43.01-PM.mov[\/KGVID]<\/p>\n<p>A veces el trabajo es mas que unos cuantos archivos, para este caso uso un IDE, mi IDE favorito es PyCharm Pro, es muy r\u00e1pido, el manejo de archivos es super f\u00e1cil, la integraci\u00f3n con GIT es bastante buena, pero sobre todo la integraci\u00f3n con Python y Django.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-5434 aligncenter\" src=\"https:\/\/islascruz.org\/blog\/wp-content\/uploads\/2018\/07\/Unknown.jpeg\" alt=\"\" width=\"186\" height=\"186\" srcset=\"https:\/\/islascruz.org\/blog\/wp-content\/uploads\/2018\/07\/Unknown.jpeg 186w, https:\/\/islascruz.org\/blog\/wp-content\/uploads\/2018\/07\/Unknown-150x150.jpeg 150w, https:\/\/islascruz.org\/blog\/wp-content\/uploads\/2018\/07\/Unknown-50x50.jpeg 50w\" sizes=\"auto, (max-width: 186px) 100vw, 186px\" \/>Las referencias entre el c\u00f3digo son muy acertadas: Cmd + click en una funci\u00f3n\/clase\/variable me lleva a su definici\u00f3n. \u00a0Muchas veces escribo el c\u00f3digo y cuando hay una funci\u00f3n\/variable no definida posiciono el cursor en dicho c\u00f3digo, presiono Cmd+1 y me aparecen opciones para importar el objeto si es que esta definido en alg\u00fan lugar o crearlo. tambi\u00e9n te dice si hay variables creadas y no usadas.<\/p>\n<p>Adem\u00e1s el formateo del c\u00f3digo es bastante bueno, escribo un pedazo de c\u00f3digo y presiono &#8220;Cmd+F&#8221; y listo, formato autom\u00e1tico e imports optimizados.<\/p>\n<h3>Sigue la PEP8 al escribir c\u00f3digo<\/h3>\n<p><a href=\"https:\/\/legacy.python.org\/dev\/peps\/pep-0008\/\" target=\"_blank\" rel=\"noopener noreferrer\">Esto<\/a> te ayudar\u00e1 y ayudar\u00e1 al resto de tu equipo a tener c\u00f3digo legible, algo que pueda mantenerse por mucho tiempo. A veces estamos acostumbrados a otros lenguajes donde escribimos sin limites, pero leer c\u00f3digo se vuelve dif\u00edcil si aparte de desplazarte de arriba hacia abajo tienes que hacerlo de izquierda a derecha.<\/p>\n<p>Adem\u00e1s, tener un limite de caracteres te ayuda a medir la cantidad de veces que estas anidando c\u00f3digo, lo mejor es evitar c\u00f3digo anidado.<\/p>\n<p>Otras herramientas que puedes usar es <a href=\"http:\/\/flake8.pycqa.org\/en\/latest\/\" target=\"_blank\" rel=\"noopener noreferrer\">flake8<\/a>\u00a0y <a href=\"https:\/\/github.com\/hhatto\/autopep8\" target=\"_blank\" rel=\"noopener noreferrer\">autopep8<\/a>, Ambos son herramientas que usas desde la terminal o integradas en su editor para formatear el c\u00f3digo.<\/p>\n<h3>Usa el Zen of Python como gu\u00eda para tomar decisiones<\/h3>\n<p>El <a href=\"https:\/\/es.wikipedia.org\/wiki\/Zen_de_Python\" target=\"_blank\" rel=\"noopener noreferrer\">Zen de Python<\/a> te dar\u00e1 la gu\u00eda para decidir sobre que hacer con tu c\u00f3digo, no te dice como lo debes escribir, sino como debes pensar si estas programando en Python.<\/p>\n<p>Entre los principios que mas me gustan:<\/p>\n<ul>\n<li><strong>Expl\u00edcito es mejor que impl\u00edcito<\/strong>: Que no se asuma nada, aseg\u00farate que las cosas sean.<\/li>\n<li><strong>Simple es mejor que complejo<\/strong>: Evita c\u00f3digo complejo, c\u00f3digo espagueti o que hace mas cosas para poder hacer una simple tarea.<\/li>\n<li><strong>Plano es mejor que anidado<\/strong>: Si tu c\u00f3digo tiene mas de 3 niveles de identaci\u00f3n, deber\u00edas mover parte de ese c\u00f3digo a una funci\u00f3n.<\/li>\n<li><strong>Los errores nunca deber\u00edan pasar silenciosamente<\/strong> y <strong>A menos que se silencien expl\u00edcitamente<\/strong>:\u00a0No uses un Try\/Except sin definir que tipo de error vas a cachar, viene de la mano con <strong>Explicito es mejor que impl\u00edcito<\/strong>.<\/li>\n<li><strong>Si la implementaci\u00f3n es dif\u00edcil de explicar, es mala idea<\/strong>.<\/li>\n<\/ul>\n<p>Para la consulta r\u00e1pida aplica este c\u00f3digo en el interprete de Python:<\/p>\n<pre>&gt;&gt;&gt; import this\nThe Zen of Python, by Tim Peters\n\nBeautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\nFlat is better than nested.\nSparse is better than dense.\nReadability counts.\nSpecial cases aren't special enough to break the rules.\nAlthough practicality beats purity.\nErrors should never pass silently.\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to guess.\nThere should be one-- and preferably only one --obvious way to do it.\nAlthough that way may not be obvious at first unless you're Dutch.\nNow is better than never.\nAlthough never is often better than *right* now.\nIf the implementation is hard to explain, it's a bad idea.\nIf the implementation is easy to explain, it may be a good idea.\nNamespaces are one honking great idea -- let's do more of those!<\/pre>\n<h3>Aprende las diferencias entre diferentes formas de hacer las cosas<\/h3>\n<p>Python no es un lenguaje que en el que las cosas se hagan de una sola forma, por ejemplo, para duplicar una lista.<\/p>\n<pre>a = range(10)\nb = a[:]\nc = [k for k in a]\nd = []\nfor i in a:\n    d.append(i)\ne = []\ne.extend(a)\n\nfor i in \"abcde\":\n    print i\n    print locals()[i]\n\na\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nb\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nc\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nd\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\ne\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<\/pre>\n<p>Todas son formas v\u00e1lidas de copiar una lista, pero alguna de ellas es mas eficiente que la otra, tal vez ser eficiente implica complejidad en la lectura del c\u00f3digo, o resulta en asignaci\u00f3n de memoria innecesaria; aprende cual es la mas \u00f3ptima para tu c\u00f3digo, y recuerda, simple es mejor que complejo.<\/p>\n<h3>Aprende la sintaxis de Python.<\/h3>\n<p>La sintaxis b\u00e1sica asumo que ya la sabes, no hay mayor complicaci\u00f3n, pero hay uno que otro truquito en la sintaxis de Python, sabias que puedes intercambiar valores en las variables de forma f\u00e1cil?.<\/p>\n<p>Algo como esto:<\/p>\n<pre>Val1 = 15\nVal2 = 25\nprint \"Antes del cambio: \", Val1, Val2\nAntes del cambio: 15 25\n\ntemp = Val1\nVal1 = Val2\nVal2 = temp\nprint \"despues del cambio\", Val1, Val2\ndespues del cambio 25 15<\/pre>\n<p>Puede perfectamente quedar as\u00ed:<\/p>\n<pre>Val1 = 15\nVal2 = 25\nprint \"Antes del cambio: \", Val1, Val2\nAntes del cambio: 15 25\n\nVal1, Val2 = Val2, Val1\nprint \"despues del cambio\", Val1, Val2\ndespues del cambio 25 15<\/pre>\n<p>Ejemplos como este hay muchos, siempre hay una forma &#8220;pythonica&#8221; de hacer las cosas.<\/p>\n<hr \/>\n<p>Si te gust\u00f3 el articulo, compartelo en tus redes sociales, si tienes algo \u00a0que agregar con toda confianza hazlo en los comentarios.<\/p>\n<p><strong>Tambi\u00e9n tenemos un curso <a href=\"https:\/\/islascruz.org\/blog\/courses\/programacion-basica-en-python\/\">b\u00e1sico de programaci\u00f3n en Python<\/a> que puedes aprovechar para reforzar tus conocimientos<\/strong><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5426\" class=\"pvc_stats all  \" data-element-id=\"5426\" 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>Programar es divertido, sobre todo si tienes a tus manos el lenguaje de programaci\u00f3n y otras herramientas de tu elecci\u00f3n, sin embargo, a veces cometemos errores que bien f\u00e1cil podemos evitar si seguimos estas buenas pr\u00e1cticas.<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5426\" class=\"pvc_stats all  \" data-element-id=\"5426\" 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":5434,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,14,15],"tags":[],"class_list":["post-5426","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-espanol","category-programming","category-python"],"a3_pvc":{"activated":true,"total_views":55626,"today_views":0},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5426","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=5426"}],"version-history":[{"count":6,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5426\/revisions"}],"predecessor-version":[{"id":5810,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5426\/revisions\/5810"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media\/5434"}],"wp:attachment":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media?parent=5426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/categories?post=5426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/tags?post=5426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}