¿Cómo dividir el script de Python en partes e importar las partes en un bucle?

Primero, perdón por mi estúpido título :) Y aquí está mi problema ... En realidad, no es un problema. Todo funciona, pero quiero tener una mejor estructura ...

Tengo una secuencia de comandos de Python con un bucle "en bucle" cada segundo. En el bucle hay muchos IF. ¿Es posible poner cada IF en un archivo separado y luego incluirlo en el ciclo? De esta manera, cada vez que el bucle se "bucle", también se pasarán todos los IF.

Hay demasiadas condiciones en mi script y todas ellas son generalmente diferentes de las demás, así que quiero tener algún tipo de carpeta con módulos: mod_wheather.py, mod_sport.py, mod_horoscope.py, etc.

Gracias por adelantado. Espero haber escrito todo lo comprensible ..

EDIT: Aquí hay un ejemplo estructural de lo que tengo ahora:

while True:
   if condition=='news':
      #do something

   if condition=='sport':
      #so something else

   time.sleep(1)

Sería bueno si pudiera tener algo como esto:

while True:
   import mod_news
   import mod_sport

   time.sleep(1)

Y estos IF del primer ejemplo se separan en archivos mod_news.py, mod_sport.py ...

preguntado el 27 de agosto de 11 a las 19:08

Huele a algo raro ... ¿Podrías agregar un segmento relevante de tu código a la publicación, por favor? -

6 Respuestas

quizás se pregunte cómo trabajar con sus propios módulos en general. cree un archivo llamado 'weather.py' y haga que contenga las instrucciones if apropiadas como:

""" weather.py - conditions to check """

def check_all(*args, **kwargs):
    """ check all conditions """
    if check_temperature(kwargs['temperature']):
        ... your code ...

def check_temperature(temp):
    -- perhaps some code including temp or whatever ...
    return temp > 40

lo mismo para sport.py, horoscope.py, etc.

entonces su secuencia de comandos principal se vería así:

import time, weather, sport, horoscope
kwargs = {'temperature':30}
condition = 'weather'
while True:
    if condition == 'weather':
        weather.check_all(**kwargs)
    elif condition == 'sport':
        sport.check_all()
    elif condition == 'horoscope':
        horoscope.check_all()
    time.sleep(1)

editar: editado de acuerdo con la edición de su pregunta. Tenga en cuenta que sugiero importar todos los módulos solo una vez, al comienzo del script, y usar sus funciones. Esto es mejor que ejecutar código mediante la importación. Pero si insistes, te vendría bien reload(weather), que en realidad realiza una recarga que incluye la ejecución de código. ¡Pero no puedo enfatizar demasiado que usar funciones de módulos externos es una mejor manera de hacerlo!

Respondido 28 ago 11, 00:08

¡Gracias! Funciona. He usado tu primer ejemplo. solamente lo hago weather.check_all('sport') y sport.check_all('sport') en el bucle y funciona muy bien. He puesto los IF en los módulos externos, así que de esta manera es perfecto. Gracias otra vez. - Ned Stefanov

hablaste de depurar; si no usa un depurador como en Eclipse con Pydev, por ejemplo, puede usar 'import traceback' y poner el bucle while después de una declaración 'try' como 'try: .. while loop .. excepto: traceback.print_exc () '. Ps, si funciona, ¡me sentiría honrado de que aceptaras mi respuesta! - Remi

Por supuesto que aceptaré tu respuesta. Solo estaba haciendo algunas pruebas adicionales :) Gracias por tu consejo. - Ned Stefanov

Colóquelos en funciones en archivos separados y luego impórtelos:

"""thing1.py
   A function to demonstrate
"""

def do_things(some_var):
    print("Doing things with %s" % (some_var))

``

"""thing2.py
   Demonstrates the same thing with a condition
"""

def do_things(some_var):
    if len(some_var) < 10:
        print("%s is < 10 characters long" % (some_var))
    else:
        print("too long")

``

"""main_program.py"""
import thing1, thing2

myvar = "cats"
thing1.do_things(myvar)
thing2.do_things(myvar)

Respondido 28 ago 11, 00:08

Creo que estás buscando algún tipo de PHP include() o preprocesador de C #include. Tendrías un archivo como el included.py abajo:

a = 2
print "ok"

y otro archivo que tiene el siguiente código:

for i in values:
    import included

y quieres que el resultado sea equivalente a

for i in values:
    a = 2
    print "ok"

¿Es lo que buscas? Si es así ... no, no es posible. Una vez que Python importa un módulo, el código del módulo se ejecuta y las siguientes importaciones del mismo modo solo recuperan la instancia ya importada del módulo. El código de un módulo no se ejecuta cada vez que se importa.

Puedo inventar algunas formas locas de hacerlo (digamos, file.read() + eval()o llamando reload() en un módulo importado.) pero sería una mala idea de todos modos. Apuesto a que podemos pensar en una mejor solución para su reales. problema :)

Respondido 29 ago 11, 06:08

Sí, eso es lo que estoy buscando ... :( Gracias por tu respuesta. Como escribí arriba, todo funciona ahora, pero solo quiero dividir el script largo en partes para facilitar la depuración ... lástima - Ned Stefanov

si esto es lo que está buscando, consulte la edición de mi respuesta, incluida la declaración de recarga: Remi

Quizás todo lo que necesita es llamar a funciones en su ciclo; y tener esas funciones en otros módulos, que importa según sea necesario.

while true:
   if condition:
      from module_a import f
      f()
   if condition2
      from module_b import g
      g()

Aunque lo anterior es Python legal y, por lo tanto, responde a su pregunta, en la práctica debería escribir todas las importaciones en la parte superior de su archivo.

Respondido el 04 de Septiembre de 11 a las 13:09

No realice importaciones en medio de una función, colóquelas siempre en la parte superior. Cada declaración de importación volverá a ejecutar el archivo importado. - Brendan Long

Quizás en mi caso esto sea algo bueno. Quiero volver a ejecutar el archivo importado cada vez en el bucle y verificar las condiciones IF dentro ... - Ned Stefanov

@Niki Stefanov - ¿Hay alguna razón por la que no puedas simplemente llamar a una función? - Brendan Long

Puede importar los módulos necesarios si son necesarios, por ejemplo:

if condition:
    import weather
    ... do something

Sin embargo, no estoy seguro de si eso es lo que realmente quieres.

Respondido 28 ago 11, 00:08

Tengo una secuencia de comandos de Python con un bucle "en bucle" cada segundo. En el bucle hay muchos IF.

Entonces debes optimizar las pruebas ejecutadas repetidamente. Suponga que hay 50 bloques IF en su código y que en un turno del bucle for, la N-ésima condición es Verdadera: eso significa que las N-1 otras condiciones deben probarse antes de que la N-ésima se pruebe y active la ejecución de el código correspondiente.

Sería preferible hacerlo:

# to_include.py

def func_weather(*args,**kwargs):
    # code
    return "I'm the weather"

def func_horoscope(*args,**kwargs):
    # code
    return "Give me your birth'date"

def func_gastronomy(*args,**kwargs):
    # code
    return 'Miam crunch'

def func_sports(*args,**kwargs):
    # code
    return 'golf, swimming and canoeing in the resort station'



didi = {'weather':func_weather, 'horoscope':func_horoscope,
        'gastronomy':func_gastronomy, 'sports':func_sports}

y el módulo principal:

# use_to_include.py

import to_include

x = 'sports'

y = to_include.didi[x]()
# instead of
# if  x =='weather'   : y = func_weather()
# elif x=='horoscope' : y = func_horoscope()
# elif x=='gastronomy': y = func_gastronomy()
# elif x=='sports'    : y = func_sports()

print y

resultado

golf, swimming and canoeing in the resort station

Respondido 28 ago 11, 05:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.