Что может быть причиной сбоя этого кода Python в НЕКОТОРЫХ? - PullRequest
2 голосов
/ 14 мая 2019
class Websites
    default = 'https://google.com'
    spotify = 'https://spotify.com'
    facebook = 'https://facebook.com'
    twitter = 'https://twitter.com'

[...]

from websites import Websites

random_website = random.choice(list(vars(Websites).values()))
browser.get(random_website)  # This line fails like 30-50% of the time

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

Отладка, я обнаружил, что случайным образом будет установлено что-то вроде этого: random_website = {getset_descriptor} <attribute '__dict__' of 'Websites' objects>

Я действительно не уверен, почему это не будет работать, потому что я протестировал все URL-адресанесколько раз.

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

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Вы довольно четко изложили свой мыслительный процесс в комментариях к ответу Безумных Физиков, поэтому вам просто необходим мини-учебник по Python.

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

websites = {'default':'https://www.google.com', 'stack':'https://stackoverflow.com'}

B. Вы можете получить список всех ключей в словаре или список пар (ключ, значение) с именем tuples . Это означает замену vars(Websites).values() на websites.keys() или websites.items(). Тогда ваш код даст вам случайный ключ или элемент.

C. Если вы выбрали `` `keys ()` `, то вы можете просто напечатать случайную вещь, которую вы получили, и использовать этот ключ, чтобы получить соответствующее значение из словаря.

random_key = random.choice(websites.keys())
print(random_key)
random_website = websites[random_key] # this is how you get values using keys

D. Если вы выбрали items(), то полученный вами кортеж - это, по сути, неизменяемый список (вы не можете изменить или присвоить какое-либо значение). Вы можете вытащить их, указав индекс в списке. Индексы Python начинаются с 0.

random_item = random.choice(websites.items())
print(random_item) # something like ('default', 'https://www.google.com')
random_key = random_item[0] # this is how you choose an item from a list or tuple
print(random_key)
random_website = random_item[1]
3 голосов
/ 14 мая 2019

vars(Websites)

  1. - это словарь
  2. содержит все виды объектов, в основном унаследованных от object

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

Поэтому у вас есть два варианта:

  1. Сохранение в вашем текущем курсе и фильтр для дандеров:

    items = [v for k, v in vars(Website).items() if not k.startswith('__')]
    

    Это не рекомендуемый подход.

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