{"id":385,"date":"2024-12-05T19:30:25","date_gmt":"2024-12-05T19:30:25","guid":{"rendered":"https:\/\/equipomedios.com\/blog\/?p=385"},"modified":"2024-10-18T19:31:36","modified_gmt":"2024-10-18T19:31:36","slug":"modulos-en-python","status":"publish","type":"post","link":"https:\/\/equipomedios.com\/blog\/modulos-en-python\/","title":{"rendered":"M\u00f3dulos en Python"},"content":{"rendered":"<h1>M\u00f3dulos Python<\/h1>\n<p>Un m\u00f3dulo le permite a usted organizar l\u00f3gicamente su c\u00f3digo Python. Agrupando c\u00f3digo relacionado dentro de un m\u00f3dulo hace el c\u00f3digo mas f\u00e1cil de entender y usar. Un m\u00f3dulo es un objeto de Python con atributos con nombres arbitrarios que puede enlazar y hacer referencia.<\/p>\n<p>Simplemente, un m\u00f3dulo es no es otra cosa sino un archivo con extensi\u00f3n\u00a0<strong>.py<\/strong>. Un m\u00f3dulo puede definir funciones, clases y variables, tambi\u00e9n puede incluir c\u00f3digo ejecutable.<\/p>\n<p>El c\u00f3digo Python para un m\u00f3dulo nombrado\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">funciones<\/span><\/code>\u00a0normalmente reside un archivo llamado\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">utilidades.py<\/span><\/code>. A continuaci\u00f3n un ejemplo de un simple m\u00f3dulo llamado\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">utilidades.py<\/span><\/code>:<\/p>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"sd\">\"\"\" M\u00f3dulo para c\u00e1lculos diversos \"\"\"<\/span>\r\n\r\n<span class=\"k\">def<\/span> <span class=\"nf\">suma_total<\/span><span class=\"p\">(<\/span><span class=\"n\">monto<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">\"\"\" Calcula la suma total \"\"\"<\/span>\r\n    <span class=\"n\">calculo_suma<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">20<\/span>\r\n    <span class=\"n\">calculo_suma<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">monto<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">calculo_suma<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<div id=\"sentencia-import\" class=\"section\"><span id=\"python-sent-import\"><\/span><\/p>\n<h2>Sentencia import<\/h2>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">import<\/span><\/code>\u00a0se utiliza para importar un m\u00f3dulo. Usted puede usar cualquier archivo de c\u00f3digo Python como un m\u00f3dulo ejecutando esta sentencia en otro archivo de c\u00f3digo Python. La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">import<\/span><\/code>\u00a0tiene la siguiente sintaxis:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">os<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">re<\/span><span class=\"o\">,<\/span> <span class=\"nn\">datetime<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Cuando el interprete encuentra una sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">import<\/span><\/code>, este importa el m\u00f3dulo si el mismo esta presente en la ruta de b\u00fasqueda. Una ruta de b\u00fasqueda es una lista de directorios que el interprete busca antes de importar un m\u00f3dulo.<\/p>\n<p>Por ejemplo, al importar el m\u00f3dulo\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">utilidades.py<\/span><\/code>, usted necesita colocar la siguiente sentencia al tope del otro script Python. A continuaci\u00f3n un ejemplo de un simple m\u00f3dulo,\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">calculo_factura_pipo.py<\/span><\/code>.<\/p>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"c1\"># Importar el modulo llamado \"utilidades\"<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">utilidades<\/span>\r\n\r\n<span class=\"nb\">print<\/span> <span class=\"s2\">\"Importo el modulo '<\/span><span class=\"si\">{0}<\/span><span class=\"s2\">'<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">\"<\/span><span class=\"o\">.<\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"vm\">__file__<\/span><span class=\"o\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span>\r\n    \t<span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"vm\">__file__<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"utilidades.pyc\"<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"nb\">print<\/span> <span class=\"sa\">u<\/span><span class=\"s2\">\"Funci\u00f3n '<\/span><span class=\"si\">{0}<\/span><span class=\"s2\">' del m\u00f3dulo '<\/span><span class=\"si\">{1}<\/span><span class=\"s2\">' llamado y mostr\u00f3:\"<\/span><span class=\"o\">.<\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"n\">suma_total<\/span><span class=\"o\">.<\/span><span class=\"vm\">__name__<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"vm\">__file__<\/span><span class=\"o\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span>\r\n    \t<span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"vm\">__file__<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"utilidades.pyc\"<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># Usted puede llamar una funci\u00f3n definida dentro del m\u00f3dulo<\/span>\r\n<span class=\"nb\">print<\/span> <span class=\"s2\">\"Monto total a facturar: <\/span><span class=\"si\">{0}<\/span><span class=\"s2\"> BsS.\"<\/span><span class=\"o\">.<\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span>\r\n\t<span class=\"n\">utilidades<\/span><span class=\"o\">.<\/span><span class=\"n\">suma_total<\/span><span class=\"p\">(<\/span><span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"nb\">input<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Ingrese un monto: \"<\/span><span class=\"p\">))))<\/span> \r\n<\/pre>\n<\/div>\n<\/div>\n<p>Cuando el c\u00f3digo anterior es ejecutado, ese produce el siguiente resultado:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"n\">Importo<\/span> <span class=\"n\">el<\/span> <span class=\"n\">modulo<\/span> <span class=\"s1\">'utilidades.pyc'<\/span>\r\n\r\n<span class=\"n\">Funci\u00f3n<\/span> <span class=\"s1\">'suma_total'<\/span> <span class=\"k\">del<\/span> <span class=\"n\">m\u00f3dulo<\/span> <span class=\"s1\">'utilidades.pyc'<\/span> <span class=\"n\">llamado<\/span> <span class=\"n\">y<\/span> <span class=\"n\">mostr\u00f3<\/span><span class=\"p\">:<\/span>\r\n<span class=\"n\">Ingrese<\/span> <span class=\"n\">un<\/span> <span class=\"n\">monto<\/span><span class=\"p\">:<\/span> <span class=\"mi\">56987<\/span>\r\n<span class=\"n\">Monto<\/span> <span class=\"n\">total<\/span> <span class=\"n\">a<\/span> <span class=\"n\">facturar<\/span><span class=\"p\">:<\/span> <span class=\"mi\">57007<\/span> <span class=\"n\">BsS<\/span><span class=\"o\">.<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Un m\u00f3dulo se carga solo una vez, independientemente de la cantidad de veces que se importe. Esto evita que la ejecuci\u00f3n del m\u00f3dulo ocurra una y otra vez si se producen m\u00faltiples importaciones.<\/p>\n<p>La primera vez que un m\u00f3dulo es importado en un script de Python, se ejecuta su c\u00f3digo una vez. Si otro m\u00f3dulo importa el mismo m\u00f3dulo este no se cargar\u00e1 nuevamente; los m\u00f3dulos son inicializados una sola vez.<\/p>\n<p>Esto se debe al c\u00f3digo objeto compilado que genera en el mismo directorio del m\u00f3dulo que cargo con la extensi\u00f3n de archivo\u00a0<strong>.pyc<\/strong>, ejecutando las siguientes sentencias:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">funciones<\/span><span class=\"o\">,<\/span> <span class=\"nn\">os<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">archivos<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">listdir<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">path<\/span><span class=\"o\">.<\/span><span class=\"n\">abspath<\/span><span class=\"p\">(<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"n\">funciones<\/span><span class=\"o\">.<\/span><span class=\"vm\">__file__<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"\/utilidades.pyc\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"\/\"<\/span><span class=\"p\">))<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">print<\/span> <span class=\"nb\">filter<\/span><span class=\"p\">(<\/span><span class=\"k\">lambda<\/span> <span class=\"n\">x<\/span><span class=\"p\">:<\/span> <span class=\"n\">x<\/span><span class=\"o\">.<\/span><span class=\"n\">startswith<\/span><span class=\"p\">(<\/span><span class=\"s1\">'funciones.'<\/span><span class=\"p\">),<\/span> <span class=\"n\">archivos<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">['utilidades.py', 'utilidades.pyc']<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>De esta forma se comprueba que existe el archivo compilado de Python junto con el mismo m\u00f3dulo Python.<\/p>\n<\/div>\n<div id=\"localizando-modulos\" class=\"section\"><span id=\"python-localizar-modulos\"><\/span><\/p>\n<h2>Localizando m\u00f3dulos<\/h2>\n<p>Cuando usted importa un m\u00f3dulo, el interprete Python busca por el m\u00f3dulo en la secuencia siguiente:<\/p>\n<ol class=\"arabic simple\">\n<li>El directorio actual.<\/li>\n<li>Si el m\u00f3dulo no es encontrado, Python entonces busca en cada directorio en la variable de entorno\u00a0<span class=\"std std-ref\">PYTHONPATH<\/span>\u00a0del sistema operativo.<\/li>\n<li>Si todas las anteriores fallan, Python busca la ruta predeterminada. En UNIX, la ruta predeterminada normalmente esta\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">\/usr\/local\/lib\/python\/<\/span><\/code>.<\/li>\n<\/ol>\n<p>El ruta de b\u00fasqueda de m\u00f3dulo es almacenado en el m\u00f3dulo de system\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">sys<\/span><\/code>\u00a0como la variable\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">sys.path<\/span><\/code>. La variable\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">sys.path<\/span><\/code>\u00a0contiene el directorio actual,\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">PYTHONPATH<\/span><\/code>, y las predeterminadas dependencia de instalaci\u00f3n.<\/p>\n<\/div>\n<div id=\"pythonpath\" class=\"section\"><span id=\"python-variable-entorno-path\"><\/span><\/p>\n<h2>PYTHONPATH<\/h2>\n<p>Es una variable de entorno del sistema operativo, consistiendo de una lista de directorios. La sintaxis de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">PYTHONPATH<\/span><\/code>\u00a0es la misma como la del shell de la variable\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">PATH<\/span><\/code>.<\/p>\n<p>As\u00ed es una t\u00edpica definici\u00f3n de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">PYTHONPATH<\/span><\/code>\u00a0desde un sistema Windows, ejecutando:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"nb\">set<\/span> <span class=\"n\">PYTHONPATH<\/span> <span class=\"o\">=<\/span> <span class=\"n\">C<\/span><span class=\"p\">:<\/span>\\<span class=\"n\">python20<\/span>\\<span class=\"n\">lib<\/span><span class=\"p\">;<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>As\u00ed es una t\u00edpica definici\u00f3n de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">PYTHONPATH<\/span><\/code>\u00a0desde un sistema UNIX, ejecutando:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"nb\">set<\/span> <span class=\"n\">PYTHONPATH<\/span> <span class=\"o\">=<\/span> <span class=\"o\">\/<\/span><span class=\"n\">usr<\/span><span class=\"o\">\/<\/span><span class=\"n\">local<\/span><span class=\"o\">\/<\/span><span class=\"n\">lib<\/span><span class=\"o\">\/<\/span><span class=\"n\">python<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"espacios-de-nombres-y-alcance\" class=\"section\"><span id=\"python-modulos-namespace-alcance\"><\/span><\/p>\n<h2>Espacios de nombres y alcance<\/h2>\n<p>Las\u00a0<span class=\"std std-ref\">variables<\/span>\u00a0son nombres (identificadores) que se asignan a objetos.<\/p>\n<p>Un espacio de nombres o namespace, es un diccionario de nombres de variables (claves) y sus objetos (valores) correspondientes.<\/p>\n<p>Una sentencia de Python puede acceder a las variables en un espacio de nombres local y en el espacio de nombres global. Si una\u00a0<em>variable local<\/em>\u00a0y una\u00a0<em>variable global<\/em>\u00a0tienen el mismo nombre, la\u00a0<em>variable local<\/em>\u00a0sombrea la\u00a0<em>variable global<\/em>.<\/p>\n<p>Cada\u00a0<span class=\"std std-ref\">funci\u00f3n<\/span>\u00a0tiene su propio espacio de nombres local. Los\u00a0<span class=\"std std-ref\">m\u00e9todos<\/span>\u00a0de Clase siguen la misma regla de alcance que las funciones ordinarias.<\/p>\n<p>Python hace conjeturas educadas sobre si las variables son locales o globales. Se supone que cualquier variable asignada a un valor en una funci\u00f3n es local.<\/p>\n<p>Por lo tanto, para asignar un valor a una variable global dentro de una funci\u00f3n, primero debe usar la sentencia\u00a0<span class=\"std std-ref\">global<\/span>.<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">global<\/span> <span class=\"n\">nombre<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">nombre<\/span>\r\n<span class=\"go\">'Leonardo'<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>La sintaxis\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">global<\/span>\u00a0<span class=\"pre\">nombre<\/span><\/code>, le dice al interprete Python que la variable\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">nombre<\/span><\/code>\u00a0es una\u00a0<em>variable global<\/em>. Python deja de buscar la variable en el espacio de nombres local.<\/p>\n<p>Por ejemplo, defina una variable\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Money<\/span><\/code>\u00a0en el espacio de nombres global. Dentro de la funci\u00f3n\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Money<\/span><\/code>, asigna un valor a\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Money<\/span><\/code>, por lo tanto, Python asume que\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Money<\/span><\/code>\u00a0es una variable local. Sin embargo, accede al valor de la variable local\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Money<\/span><\/code>\u00a0antes de configurarlo, por lo que el resultado es una excepci\u00f3n\u00a0<span class=\"std std-ref\">UnboundLocalError<\/span>. Si descomenta la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">global<\/span><\/code>, se soluciona el problema.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>M\u00f3dulos Python Un m\u00f3dulo le permite a usted organizar l\u00f3gicamente su c\u00f3digo Python. Agrupando c\u00f3digo relacionado dentro de un m\u00f3dulo hace el c\u00f3digo mas f\u00e1cil de entender y usar. Un m\u00f3dulo es un objeto de Python con atributos con nombres arbitrarios que puede enlazar y hacer referencia. Simplemente, un m\u00f3dulo es no es otra cosa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":331,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[39,40],"tags":[],"class_list":["post-385","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-python"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/equipomedios.com\/blog\/wp-content\/uploads\/2024\/08\/python-logo-master-v3-TM.png?fit=601%2C203&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/comments?post=385"}],"version-history":[{"count":1,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/385\/revisions"}],"predecessor-version":[{"id":386,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/385\/revisions\/386"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media\/331"}],"wp:attachment":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media?parent=385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/categories?post=385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/tags?post=385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}