Как через импортированный модуль изменить переменную?
Импортированный модуль имеет некую функцию, которая при выполнении изменяет переменную импортирующего файла, при этом в зависимости от аргумента может изменяться другая переменная. Как должен выглядеть код модуля, чтобы в основном файле избежать var = module.func(args), а модуль сам менял нужную var?
основной файл:
var = 0 #и другие переменные
module.func(args)
модуль:
func(args): #код, чтобы изменить var или другую переменную
Alexa2007, функция модуля изменяет переменную основного файла без вызова в основном файле дополнительных функций и без выражений в основном файле var = module.func(args). Я имел ввиду "код" - как набор команд внутри такой функции. Вопрос именно про это.
Ну мы или про return говорим или я вооооообще нифига не понял второй раз, поэтому и прошу вас хоть примерно набросать код, чтобы понять что у вас голове т.к. выразить что вы имеите ввиду вам похоже не удалось
Павел Соколов, выглядит как антипатерн, все не явные изменения переменных надо избегать.
лучше явно переприсваивать новое значение, чем держать в голове, кто что и где меняет
def do(args):
#calc & etc
if smth:
var1 from a = smth
else:
var3 from a = smth
после do() в а.py должна измениться либо var1 или var3
как это реализовать
про return: я знаю как его использовать и оно работает, только если будет что-то типа var2 = b.do() в основном файле, что я хочу избежать
Павел Соколов, ну да.. не получается. И импорты тут не помогут. Только ретёрны. Ни есть еще один вариант.... обраащаться напрямую к памяти. Но я думаю это вообще изврат. А в чем такая проблема с var2 = b.do( )
Alexa2007, потому что будет много классов внутри модуля, которые просто возвращают результат или ничего, при этом изменение затронет формат переменных, число возвращаемых значений, поэтому обойтись только var2=b.do() не получится, потому что будут списки, кортежи и т.п., и куча if испортит код (я попробовал написать код из 4,5к строчек с огромным кол-вом if, ничего хорошего по производительности не вышло)
Павел Соколов, так может переопределить пару методов у встроенного класса.. Чтоб переменные не просто телепались, а просчитывались на этапе создания ... ну или рядом. Короче мне твой вопрос покоя не даёт, вот и сижу ковыряюсь.
class mylist(list):
def append(self,item):
super().append(item)
def get_all(self):
for _ in self:
for item in _:# Эта строка из-за того что список в списке
print(item**2)
var1 = mylist()
var1.append([i for i in range(10)])
var1.get_all()
Alexa2007, данный метод работает для определения значений при создании, у меня же пользователь вправе вводить команды, которые воспримет класс модуля и отправит крутиться через функции другого импортированного в него модуля, который в классе должен динамически изменять значения self
Кажется я нашел ответ на свой вопрос, но он не решает задачу в необходимом виде:
- модуль вовращает список [переменная для перезаписи, аргументы]
- в основном файле будет globals()['var_name'] = args
- если это класс, то можно выполнить exec('self.'+var_name+'='+str(args))