2 votes

Qu'est-ce qui pourrait causer l'échec de ce code Python ?

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

Notez que je n'utilise volontairement pas de dictionnaire ici, car je voudrais utiliser la valeur aléatoire pour obtenir la clé.

En déboguant, j'ai découvert qu'il se mettait aléatoirement à quelque chose comme ceci : random_website = {getset_descriptor} <attribute '__dict__' of 'Websites' objects>

Je ne sais vraiment pas pourquoi cela ne fonctionnerait pas, car j'ai testé toutes les URL plusieurs fois.

Notez également que cette application utilise des threads - il y a plusieurs instances de cette application (généralement 4) et à tout moment environ 1 à 2 échouent, au cas où cela aurait une importance. Je suis encore très novice en matière de Python et de Selenium (et je n'ai pas encore beaucoup d'expérience en codage, honnêtement). Veuillez me faire savoir si je peux fournir plus d'informations qui pourraient être utiles.

3voto

Mad Physicist Points 3218

vars(Websites)

  1. est un dictionnaire
  2. contient toutes sortes d'objets, principalement hérités de object

Si vous l'imprimez, vous verrez toutes sortes de choses comme des méthodes non liées et d'autres attributs normaux de l'objet. Cela se produit parce que l'objet __dict__ reçoit automatiquement certains éléments par défaut attribués par le type métaclasse. Tous ces attributs doivent être des dunders.

Vous avez donc deux possibilités :

  1. Persistez dans votre parcours actuel et filtrez pour les licenciés :

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

    Ce n'est pas l'approche recommandée.

  2. Utilisez simplement un dictionnaire normal qui ne contient que ce que vous voulez. Vous appelez values de toute façon. Si vous n'avez pas vraiment besoin des étiquettes, utilisez simplement une liste.

3voto

Adeola Bannis Points 331

Vous avez exposé votre processus de pensée assez clairement dans les commentaires de la réponse de Mad Physicists, vous avez donc juste besoin d'un mini-tutoriel en Python.

A. Comment stocker les données. Comme suggéré ci-dessus, un dictionnaire est probablement la meilleure solution, avec des chaînes de caractères comme clés et valeurs. Vous souhaitez probablement traiter des chaînes de caractères, et non des variables.

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

B. Vous pouvez obtenir une liste de toutes les clés du dictionnaire, ou une liste de paires (clé, valeur) appelées tuples . Il s'agit de remplacer vars(Websites).values() con websites.keys() ou websites.items() . Ensuite, votre code vous donnera une clé ou un objet aléatoire.

C. Si vous avez choisi ``keys()``, alors vous pouvez juste imprimer la chose aléatoire que vous avez obtenue, et utiliser cette clé pour obtenir la valeur correspondante dans le dictionnaire.

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

D. Si vous avez choisi items() alors le tuple que vous obtenez est fondamentalement une liste immuable (vous ne pouvez pas modifier ou assigner l'une ou l'autre valeur). Vous pouvez les extraire en spécifiant un index dans la liste. Les indices Python commencent à 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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X