Как обновить глобальную переменную в 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

это работало нормально, список был обновлен и использован в загрузке ().

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

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 с понедельника. Как сохранить ссылку 3 в списке на следующие 5 дней, пока я снова не обновлю список?

Спасибо

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.

Больше примеров

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

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

Если вы не хотите самостоятельно запускать код, вы можете использовать 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

добавит ссылку 25 в глобальный список, как вы хотели

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

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

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

источник

Другие вопросы по тегам