Функция автообновления Python - PullRequest
0 голосов
/ 11 декабря 2018

Я пишу этот код для проекта, и у меня есть этот класс, который анализирует Weather из OWM.Мой код для этого раздела выглядит следующим образом:

class Meteo():
    def __init__(self):
        self.API = pyowm.OWM('My API Key', config_module=None,
                             language='it', subscription_type=None)
        self.location = self.API.weather_at_place('Rome,IT')
        self.weatherdata = self.location.get_weather()
        self.weather = str(self.weatherdata.get_detailed_status())

    def Temperature(self):
        self.tempvalue = self.weatherdata.get_temperature('celsius')
        temperature = str(self.tempvalue.get('temp'))
        return temperature

Проблема, конечно, в том, что при запуске программы в 2 часа дня, и это 20 ° C, к 2 часам ночи она все равно будет показывать ту же температуру,потому что (очевидно) он сохраняет температуру, которую анализирует при запуске.Я искал в интернете автоматическое обновление функции python, но не нашел вопроса, объясняющего мой случай.Если бы кто-то мог ответить или указать мне место, где это объясняется, я был бы очень благодарен.Спасибо

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

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

class Meteo():
    def __init__(self):
        self.last_update = 0

    def Temperature(self):

        if (time.time() - self.last_update) > 60: # cache the value for 60 seconds
            self.API = pyowm.OWM('My API Key', config_module=None,
                                 language='it', subscription_type=None)
            self.location = self.API.weather_at_place('Rome,IT')
            self.weatherdata = self.location.get_weather()
            self.weather = str(self.weatherdata.get_detailed_status())
            self.last_update = time.time()

        self.tempvalue = self.weatherdata.get_temperature('celsius')
        temperature = str(self.tempvalue.get('temp'))
        return temperature

Независимо от того, как часто вы вызываете «Температура», он будет выдавать только один запрос максимум каждые 60 секунд.

0 голосов
/ 11 декабря 2018

В общем, волшебства не происходит.Если вам нужны текущие данные, вам нужно их извлечь.

Существует множество условий, которые вы можете выбрать для «обновления данных», например, если вы обрабатываете данные в какой-либо форме или по расписанию.

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

Может быть, ссылка от Aaron_ab ( Как мне получить Cron-подобный планировщик в Python? ) лучше всего подходит для вашего сценария.Или, возможно, взгляните на Celery Beat .

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

0 голосов
/ 11 декабря 2018

Я бы просто обновил данные о погоде и затем возвратил температуру:

def update_weather(self):
    self.weatherdata = self.location.get_weather()
    self.weather = str(self.weatherdata.get_detailed_status())

def Temperature(self):
    update_weather()
    self.tempvalue = self.weatherdata.get_temperature('celsius')
    temperature = str(self.tempvalue.get('temp'))
    return temperature
...