celery any () выражение, дающее неверный результат внутри задачи - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий код, который выполняется в задаче celery: self.resdict ['jobs'] содержит список подзадач, и я проверяю их состояние в цикле while.

       while any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']):
            print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])
            print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']))
            time.sleep(.5)
       else:
            for a in self.resdict['accounts'][0]['result']:
                account = a['number'] if isinstance(a['number'], str) else False
                self.resdict[account] = self.resdict['jobs'][account].result[0]['result'][0]['Device Information']['subattributes']

Когда я запускаю этот код с CELERY_ALWAYS_EAGER = True и CELERY_EAGER_PROPAGATES_EXCEPTIONS = True, он дает мне ожидаемые результаты, если список содержит все «SUCCESS»

Итак, что я получаю, когда я работаю с всегда готовыми:

print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']) = ['SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS']
print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])) = False

Когда я бегу не всегда с нетерпением, внутри отладки сельдерея я вижу:

print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']) = ['SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS']
print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])) = True

Что не правильно, поскольку в списке содержится только «УСПЕХ».

Любая идеяпочему сельдерей говорит True, когда это должно быть False?

1 Ответ

0 голосов
/ 30 мая 2018

Вы не должны сравнивать строки с is.Иногда это может работать, потому что некоторые строки будут «интернированы» и кэшированы интерпретатором Python, но это гарантированно не произойдет во всех ситуациях.Вместо этого вы должны сравнивать по значению вместо идентификатора, используя == вместо is и != вместо is not.

Это должно исправить вашу текущую проблему, но я бы также предложилчто вы, кажется, не используете any очень полезным способом.Функция any возвращает True после того, как первое значение в ее итерируемом аргументе верное.Если вы просто хотите проверить пустой список, пропустите any и просто используйте сам список в качестве логического значения.Пустые списки ложны, в то время как списки с любыми элементами (независимо от значений этих элементов) являются правдивыми.

Использование any будет более целесообразным, если вы сначала не построите список.Это потому, что any замыкает накоротко, останавливаясь после первого истинного результата, не проверяя остальную часть итерируемого.Это делает его подходящим для генератора, который вычисляет свои значения лениво, но только настолько, насколько это необходимо.Вы можете заменить понимание списка выражением генератора, просто удалив квадратные скобки.Но в этом случае я бы предложил изменить ваш код, чтобы генератор выдал bool s вместо значения или ничего: any(x.status != "Success" for x in self.resdict['jobs'].values())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...