Python - перебрать логическое значение, если есть значение - PullRequest
0 голосов
/ 13 января 2019

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

Вместо запросов я создал текстовый файл для более удобного запуска программы

Я пытаюсь сделать следующее:

Я хочу сделать скрипт таким образом, чтобы он открывал txt каждый цикл, проверял, есть ли имена в списке, затем мы распечатывали его только один раз. И если нет имен - тогда я хочу создать счетчик, который проверяет, являются ли имена на самом деле пустыми или нет, то есть в этом случае я хочу создать своего рода счетчик, который подтверждает это, и заявляю, что в именах нет список. Это означает, что после 5 открытий txt файла и в списке не было имен после этих 5 в открытии строки. тогда мы можем объявить его фактически пустым.

Если счетчик подтвердил, что он пуст, то мы зациклимся, пока не найдем имена, и напечатаем его еще раз, а затем начнем все как раньше.

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

count = 0
last_names = []
names_checker = False

while True:

    with open('./test.txt') as f:
        new_product_values = json.load(f)

    # {'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}

    if names_checker == False:

        if not new_product_values['sizes']:
            count += 1
            time.sleep(1)

        if count == 5:
            names_checker = True
            count = 0
            logger.success('Declare value as No names')

        else:
            names_checker = True

    elif names_checker == True:

        while True:


            if new_product_values['names'] != last_names:

                print("NEW NAMES!")
                print(new_product_values['names'])
                last_names = new_product_values['names']
                logger.status(last_names)
                names_checker = False
                break

            else:
                logger.warn("Nothing found - sleep 1")
                time.sleep(1)

text file:

{'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}

Мои ожидаемые результаты в этом случае таковы:

Если в списке нет имен, мы добавляем одно в счетчик, если следующий цикл все еще продолжает давать нам пустое имя, тогда мы добавляем другое в счетчик, пока он не достигнет счетчика 5, когда он попадет в счетчик 5 Я хочу объявить это, поскольку список пуст. Всякий раз, когда он пуст, мы хотим зацикливаться, пока не найдем имена. И как только мы найдем имена, мы хотим объявить, что список не пуст, распечатать имена один раз и начать заново со счетчиком.

1 Ответ

0 голосов
/ 13 января 2019

Вы правы в своем анализе: вы переосмысливаете проблему.

Сначала разделите то, что вы делаете, на простые шаги

                +--------------------------+
  +-----------> |Get the data from the page| <-----------------+
  |             +-------------+------------+                   |
  |                           |                                |
  |                           v                                |
  |                                                            |
  |          +-------------------------------------------+     |
  |          |Get the data into a nice format (e.g. list)|     |
  |          +------------------+------------------------+     +------+
  |                             |                              |      |
  |                             |                     +--------+      |
  |                          +--+                     |               |
  |                          |                        |         +-------------+
  |                          v                        |         |wait for data|
  |                                                   |         +-------------+
  |         +--------------------------+              |
  |         |Do we actually have data? |              |                 ^
  |         +------+-----+-------------+              |flick            |no data
  |                |     |                            |                 |
+-+------+         |     |        +-------------------+-----------------+-----+
|do stuff|    <----+     +---->   |Is this a flick or is there really no data?|
+--------+     yes         no     +-------------------------------------------+

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

если вы поместите вышеуказанные шаги в код Python, вы получите что-то вроде этого:

def get_data():  # just an example
    r = requests.get(...)
    r.raise_for_status()
    return r

def parse_data(text, _old=[]):  # list is mutable => preserved across calls
    """convert the text to a list of names. If there are no (new) names, the list is empty"""
    ...
    if new_data not in _old:
        _old.append(new_data)
        return new_data
    else:
        return []

def delay_get_data(by):
    time.sleep(by)
    return get_data()

def do_stuff(names):
    ...

Такое разделение не только позволит лучше понять и понять ваш код, но и даст вам возможность изменить отдельные части: если вы хотите использовать локальные файлы / данные для тестирования, вы можете просто переписать get_data не меняя ничего другого:

def get_data():
    if random.randint(0, 1):  # simulate flicks
        return empty_sample_data
    else:
        return random.choice(sample_data_with_names)

Следуя приведенной выше структурной схеме, вы можете сначала получить данные, проверить их и выполнить правильные действия, прежде чем получать новые данные, посмотрев в одном цикле:

WAIT_TIME = 10*60
counter = 0
data = parse_data(get_data())
while True:
    if data:
        counter = 0
        do_stuff(data)
        print("I got the data and did {stuff}. Now I'll wait and repeat with new names")
        data = parse_data(delay_get_data(WAIT_TIME))
    else:
        counter += 1
        if counter >= 5:  # cosmic rays may increase ``counter`` by 2 instead of 1
            counter = 0
            print("I think there actually isn't any data. I'll wait and then check again")
            data = parse_data(delay_get_data(WAIT_TIME))
        else:
            data = parse_data(get_data())  # no delay, it was probably just a flick

Если новые данные поступают быстро, и вы решаете, что вам не нужно так много журналировать, вы также можете просто удалить counter.

...