Найти - Пользователи
Полная версия: Как "запустить" модуль, в котором нет функций?
Начало » Python для новичков » Как "запустить" модуль, в котором нет функций?
1 2 3
Renaldas
Новичок самоучка по Питону.
Есть два модуля, один из них хочет каждые икс секунд получать переменную из второго модуля, которая, понятное дело, должна была бы обновляться. Обязательно ли для этого во втором модуле должна быть функция, в которой и должна была бы быть данная переменная?

На примере. Если я хочу из данного модуля:

current_time_in_module = time.time()
def time_fx():
current_time_in_fx = time.time()
return current_time_in_fx

получать обновляющееся время путем итерации его в другом модуле:


for x in range(0, 100):
print(another_module.current_time_in_module)
print(another_module.time_fx())
time.sleep(1)

то обновляется только та переменная, которая “лежит” в функции и вызывается ею, переменная вне функции все время та же самая.
Поэтому вопрос, можно ли “запустить” модуль с обновляющимися переменными в нем, если они не в функции?
doza_and
Renaldas
получать переменную из второго модуля
Да никаких проблем.
Renaldas
должна была бы обновляться
А тут у вас непонимание. В питоне все выполняется последовательно. Импорт грубо говоря переход на выполнение команд из импортируемого файла. Применение функций ничего не изменит. Считайте импорт это как вставить содержимое в данное место.
Более того, и в компютере все выполняется последовательно, просто быстро переключается с одного на другое. Ну так было. Сейчас когда много ядер в процессоре это чуток изменилось. Вобщем это совсем другая история - многопоточное программирование.

Вам поначалу надо просто в цикле получать переменную, и использовать.
Потом освоить gui и управляемое событиями программирование
А уж потом браться за многопоточность.
Renaldas
doza_and

В моей программе все в одном модуле, и большущая свалка, поэтому я решил отдельные части программы выделить в отдельные модули, которые “основной” модуль запускал бы последовательно по надобности, и брал бы данные. Эмпирическим путем мне получилось установить, что если я это делаю помещая в другой модуль функцию, все работает путем вызова функции того модуля, но напрямую из модуля без функции - не могу. На интуитивно-дилетантском уровне немного странно.
Скажите, есть ли простой способ в одну-две строки “запускать” модуль из другого модуля и получать значения переменных из него, если внутри того модуля нет функций, или функции внутри модуля - это обязательное условие?
xam1816
когда вы пишете
 import some_module
это равносильно тому что вы его запускаете,нажав кнопку “выполнить”
Поэтому если в модуле написаны функции и в этом же модуле где-то вызваны,то они выполнятся как-только сделаете import
после импорта(после того как он выполнился)к любой функции или переменной можно обратится через точку
 some_module.func() # вызов функции из модуля
print(some_module.var)# вывод в консоль значение переменной из модуля

если мы не хотим, чтобы в модуле после импорта что-то выполнялось, то
пишем это в блоке if __name__ == ‘__main__’

 print('эта строка выведется,если модуль импортируют или запустят этот файл как самостоятельный')
#
if __name__ == '__main__':
    print('\nэта строка НЕ ВЫВЕДЕТСЯ, если этот модуль ИМПОРТИРУЮТ')
    print('но выведется если этот файл запустят как самостоятельный')

на основе этого разбивайте свой код на модули
doza_and
Renaldas
Эмпирическим путем мне получилось установить
Неплохо почитать теорию :)
Если коротко модуль это не функция. Его нельзя вызвать. Его можно импортировать (импорт это выполнение не более одного раза).

Назначение модуля разбить текст программы на разные файлы. Когда разбиваешь код, весьма стандартна ситуация когда модули произвольно импортируют друг друга
 # a.py
import b
import c
def some1():
    c.x()
....
#b.py
import c
def some2():
    c.x()
# c.py
def x():
   ...
Поэтому чтобы не делать лишнюю работу при импорте модуля при наличии множественных связей из разных файлов повторная загрузка модулей заблокирована. Назначение функций - выделить кусок кода который требуется многократно повторять.
В питоне многое можно. Можно и модуль конечно перезагрузить (impotlib reload), но выглядеть это будет как удаление зубов через анальное отверствие.

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

Renaldas
xam1816
когда вы пишете
А если я хочу чтобы цикл из другого модуля постоянно запускал первый модуль заново? Именно модуль, а не отдельную функцию из того модуля?
Renaldas
doza_and
сами эти модули это не выполняемый код, а контейнеры для функций
Вот, эта фраза мне понравилась, стало кое-что на свое место! Это как бы отвечает на мой вопрос, что я не могу выполнить код (кроме одного раза после импорта или принудительно реимпортируя), написанный прям в модуле, не в функции внутри модуля?
Имеет ли смысл создавать отдельный модуль с одиночной функцией в нем вместо того, чтобы просто оставить этот код в функции в том же самом модуле, где и “основная” часть одномодульной программы? Я не очень понимаю сути разбивания на модули, но интуитивно очень хочется подразбить, чтобы программа была бы более структурированной. Но для меня такая разбивка делает неразумно длинными имена переменных (добавляется каждый раз название модуля.название функции), по сравнению с тем, когда я тупо делаю все в одном модуле делая нужные переменные global.
xam1816
Renaldas
Я не очень понимаю сути разбивания на модули

Функция = это такая подпрограмма, которая должна делать что-то одно.В ней не должно быть “И”.
Нельзя делать функцию которая И конвертирует И форматирует И выводит на экран.
нужно: эта функция ковертирует, эта функция форматирует, эта выводит на экран
Вот эти отдельные функции собираются в модуль,на отдельном файле,они в нем не используются, а просто описаны

Renaldas
Но для меня такая разбивка делает неразумно длинными имена переменных (добавляется каждый раз название модуля.название функции)
это пишется так
 import module as m
data = input()
res_1 = m.func_1(data)
res_2 = m.func_2(res_1)
out = m.func_3(res_2)
print(out)

Модуль тоже должен предполагать какое-то свое направление, как допустим модуль random предполагает случайные значения, или math математические операции
Renaldas
xam1816
Значит, я изначально, когда еще не знал, что такое функция, начал ее использовать неправильно. У меня в одной функции и реквест, и подсчет полученных данных, и вывод принтами каких-то нужных результатов, и пересортировка в словари и еще куча всего. Получается, я использую функцию там, где должен был бы использовать модуль из функций, так?

Извините, вашего кода не понял, не тот уровень мой … Вот эти сокращения и перенаправления не пойми откуда куда и пугают, поэтому пока завяз на том же самом уровне, и никуда дальше. Про классы и ООП даже молчу, там вообще не та дименсия для меня
xam1816
Выложите сюда свой код, который изначально у вас был на одном файле
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB