Как разбить скрипт Python на части и импортировать части в цикл? - PullRequest
4 голосов
/ 27 августа 2011

Во-первых, простите за мой глупый заголовок :) А вот и моя проблема .. На самом деле это не проблема. Все работает, но я хочу иметь лучшую структуру ...

У меня есть скрипт на python с циклом, «зацикленным» каждую секунду. В цикле есть много много IF. Можно ли поместить каждый IF в отдельный файл, а затем включить его в цикл? Таким образом, каждый раз, когда цикл «зацикливается», все IF также будут переданы ..

В моем сценарии слишком много условий, и все они обычно отличаются от других, поэтому я хочу иметь какую-то папку с модулями - mod_wheather.py, mod_sport.py, mod_horoscope.py и т. Д.

Спасибо заранее. Надеюсь я написал все понятно ..

EDIT: Вот структурный пример того, что я имею сейчас:

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

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

   time.sleep(1)

Будет хорошо, если у меня будет что-то вроде этого:

while True:
   import mod_news
   import mod_sport

   time.sleep(1)

И эти IF из первого примера должны быть разделены в файлах mod_news.py, mod_sport.py ...

Ответы [ 6 ]

6 голосов
/ 28 августа 2011

возможно, вам интересно, как работать с собственными модулями в целом.создайте один файл с именем 'weather.py', и он будет содержать соответствующие операторы if, например:

""" 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

то же самое для sport.py, horoscope.py и т. д.

, тогда ваш основной скриптвыглядит так:

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)

редактировать: редактировать в соответствии с редактированием в вашем вопросе.Обратите внимание, что я предлагаю импортировать все модули только один раз, в начале скрипта, и использовать его функции.Это лучше, чем выполнение кода путем импорта.Но если вы настаиваете, вы можете использовать reload(weather), который фактически выполняет перезагрузку, включая выполнение кода.Но я не могу особо подчеркнуть, что использование функций внешних модулей - лучший путь!

4 голосов
/ 28 августа 2011

Поместите их в функции в отдельных файлах и затем импортируйте их:

"""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)
1 голос
/ 28 августа 2011

Полагаю, вы ищете какой-нибудь PHP-подобный include() или C препроцессор #include.У вас будет файл, такой как included.py ниже:

a = 2
print "ok"

и другой файл со следующим кодом:

for i in values:
    import included

, и вы хотите, чтобы результат был эквивалентен

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

Это то, что вы ищете?Если так ... нет, это невозможно.Как только Python импортирует модуль, код модуля выполняется, и после импорта в том же режиме только извлекается уже импортированный экземпляр модуля.Код модуля не выполняется каждый раз, когда он импортируется.

Я могу придумать несколько сумасшедших способов сделать это (скажем, file.read() + eval() или вызвать reload() в импортированном модуле.) но в любом случае это была бы плохая идея.Могу поспорить, что мы можем придумать лучшее решение вашей реальной проблемы :) 1020 *

1 голос
/ 28 августа 2011

Возможно, все, что вам нужно, это вызывать функции в вашем цикле;и иметь эти функции в других модулях, которые вы импортируете по мере необходимости.

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

Хотя вышеприведенный код является допустимым Python и поэтому отвечает на ваш вопрос, на практике вы должны написать все операции импорта в верхней части файла..

0 голосов
/ 28 августа 2011

У меня есть скрипт на python с циклом, «зацикленным» каждую секунду. В петле Есть много много IF.

Тогда вы должны оптимизировать многократно выполненные тесты. Предположим, что в вашем коде 50 блоков IFs, и что в цикле for, N-е условие имеет значение True: это означает, что N-1 другие условия должны быть проверены до того, как N-й протестирован, и запускает соответствующий код.

Было бы предпочтительнее сделать это:

# 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}

и основной модуль:

# 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

результат

golf, swimming and canoeing in the resort station
0 голосов
/ 28 августа 2011

Вы можете импортировать необходимые модули, если они необходимы, например:

if condition:
    import weather
    ... do something

Однако я не уверен, действительно ли вы этого хотите.

...