1

tengo dudas sobre módulos, he realizada varias funciones que las tengo almacenas en un programa que realice, y ahora quiero reutilizar una en especifico , se llama comprovarData()

introducir la descripción de la imagen aquí

yo la importo de lasiguiente manera :

from principal import comprovarData

introducir la descripción de la imagen aquí

La cosa es que al hacer esto es como si se ejecutara todas las linias de codigo donde he importado. Alguien me podría decir que pasa?

javic
  • 143
  • 1
  • 9

1 Answers1

3

Lo que ocurre es lo que tiene que ocurrir.

Cuando haces import, ya sea un import modulo o un from modulo import algo, el código del módulo se ejecuta al completo, pues un def es también "ejecutable" para Python, y la única forma de definir las funciones (y análogamente con class para definir clases, debe ejecutarse para que la clase quede definida).

La diferencia entre import modulo y from modulo import algo es que, aunque en ambos casos se ejecuta el contenido completo del fichero, en el primer caso todas las funciones, clases y variables que quedan definidas como consecuencia de esa ejecución quedan "metidas" en un espacio de nombres llamado modulo, de modo que para acceder a ellas debes hacer modulo.algo por ejemplo. En el segundo caso, en cambio, de todas las clases, funciones y variables definidas, python buscará una llamada algo y la añadirá al espacio de nombres global, de modo que se pueda acceder a ella sin tener que poner delante ningún espacio de nombres.

No puedes evitar que se ejecute el código completo del módulo, pero sí puedes evitar que al importar el módulo se ejecute la función main() de ese módulo ¿cómo? Simplemente no invocándola en el módulo.

El patrón típico (que quizás hayas visto ya) es el siguiente:

# Contenido del modulo
def funcion1():
   ...

def funcion2():
   ...

def main():
   ...

if __name__ == "__main__":
   main()

Esto se ejecuta desde el inicio hasta el fin, tanto si lanzas este script desde línea de comandos con python modulo.py como si importas el módulo desde otro mediante import modulo (o from modulo import funcion1).

En ambos casos se evalúan todas las líneas de modulo.py. La diferencia es que Python asigna diferente valor a la variable __name__. Cuando ejecutas ese script desde línea de comandos, el valor asignado es "__main__". Cuando lo importas, esa variable tiene el valor "modulo" (el nombre del módulo que está siendo importado).

De este modo puedes hacer que ciertas líneas sólo se ejecuten si lanzas el script desde línea de comandos y no si lo importas.

abulafia
  • 53,696
  • 3
  • 45
  • 80
  • Me ganaste. Buena respuesta. – ffflabs Nov 30 '19 at 20:55
  • soy nuevo en esto de la programacion, sabes como se llama esto que me acabas de decir , quiero buscar mas información. – javic Nov 30 '19 at 22:49
  • No tiene ningun nombre en particular, pero está en la [documentación](https://docs.python.org/3.8/library/__main__.html), y puedes encontrar información en muchos sitios de internet, incluyendo [stack overflow](https://es.stackoverflow.com/questions/32165/qu%C3%A9-es-if-name-main) – abulafia Dec 01 '19 at 00:07