как обновить глобальную переменную в python



В python у меня есть функция, которая возвращает список последних ссылок(на папки) на веб-сайте. У меня также есть другая функция, которая загружает последние файлы из этих папок. Я планирую запускать этот сценарий каждый день. У меня есть глобальный список со ссылками на папки, к которым функция загрузки обращается каждый раз, когда она работает для последних папок. Я хочу обновлять этот глобальный список каждые пять дней и сохранять его статичным в течение следующих 5 дней, пока он не обновится снова.



Это вроде как это:



list = ["link1", "link2",...]

def update():
#code to update list
return list

def download(list):
#code to download from links


Поэтому я хочу, чтобы функция обновления запускалась каждые 5 дней (я знаю, как это сделать), а функция загрузки-каждый день. Итак, как я могу сохранить список, возвращенный из update (), статическим как глобальный список, пока он не будет обновлен снова?

Править:
Позвольте мне попытаться уточнить:



Я запускаю это в понедельник:



list = ["link1", "link2"]

def update():
#code to update list
return list #--> list = ["link1", "link2", "link3"]

def download(list):
#code to download from links


Это сработало отлично, список был обновлен и использован в download().



Я запускаю это во вторник:



list = ["link1", "link2"]
#update() won't run today, only runs every 5 days
def update():
#code to update list
return list #--> list = ["link1", "link2", "link3"]

def download(list):
#code to download from links


Я перезапустил свой код, но теперь список не имеет Ссылка 3 с понедельника. Как сохранить link3 в списке в течение следующих 5 дней, пока я не обновлю список снова?



Спасибо

1250   3  

3 ответов:

Используйте оператор global. Но нет никакой необходимости в global для изменяемых объектов, если вы изменяете их на месте.

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

lis = ["link1", "link2",...]

def update():
  global lis
  #do something
  return lis

Рассольник пример:

import pickle
def update():
  lis = pickle.load( open( "lis.pkl", "rb" ) ) # Load the list
  #do something with lis                     #modify it 
  pickle.dump( lis, open( "lis.pkl", "wb" ) )  #save it again
Для повышения производительности можно также использовать модульcPickle .

Еще примеры

Нормальное объявление переменной сделает ее локальной.
Используйте ключевое слово global, чтобы сделать его глобальным.

Просто запишите список в файл и откройте его, чтобы прочитать его оттуда позже.

Если вы не хотите самостоятельно запускать код, вы можете использовать cron-job, чтобы сделать это за вас.

def read_file(filename):
    f = open(filename).read().split()
    lis = []
    for i in f:
            lis.append(i)
    return lis 

def write_file(filename,lis):
        f = open(filename,"w")
        for i in lis:
                f.write(str(i)+'\n')

До тех пор, пока он объявлен в основной программе, а не в рамках функции, вы должны быть в порядке, чтобы манипулировать вашей переменной list оттуда (ваш комментарий) просто прекрасно. Если вы хотите инициализировать его как глобальный, чтобы из области метода вы можете использовать ключевое слово global, чтобы расширить область до всей программы

list = ["link1", "link2",...]

def update():
  list.append("link25")
  return list

Добавит link25 в глобальный список, как вы хотели

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

Вы можете записать элементы списка в файл, выполнив следующее

for item in thelist:
    thefile.write("%s\n" % item)

Источник

Comments

    Ничего не найдено.