Ensemble itération de l'ordre varie d'une série à l'
Pourquoi ne l'itération de l'ordre d'un Python jeu (avec le même contenu) varient d'une série à l'autre, et quelles sont mes options pour le rendre conforme d'une exécution?
Je comprends que l'itération de commande pour un Python ensemble est arbitraire. Si j'ai mis 'a', 'b' et 'c' dans l'ensemble et puis itérer eux, ils peuvent revenir dans n'importe quel ordre.
Ce que j'ai observé, c'est que l'ordre reste le même à l'intérieur d'une exécution du programme. C'est, si mon programme parcourt le même jeu deux fois de suite, j'ai le même ordre à chaque fois. Cependant, si je lance le programme, deux fois de suite, les modifications de la commande d'une exécution.
Malheureusement, cela casse un de mes tests automatisés, qui compare simplement la sortie de deux points de mon programme. Je ne se soucie pas de l'ordre réel, mais je voudrais qu'il soit conforme d'une exécution.
La meilleure solution que j'ai trouvé est:
- Copie de l'ensemble à une liste.
- Appliquer un arbitraire de tri de la liste.
- Itérer la liste au lieu de les définir.
Est-il une solution plus simple?
Remarque: j'ai trouvé des questions similaires sur StackOverlow, mais aucun qui traitent de cette question en particulier d'obtenir les mêmes résultats d'une exécution.
- Si ce que vous faites des tests, c'est que "le programme des sorties de la même chose deux fois", la liste triée option est votre meilleur pari. Si ce que vous faites des tests, c'est que "le programme crée le même jeu deux fois", vous aurez besoin de faire un jeu de comparaison (par décapage de la sortie des deux pistes, puis unpickling la sortie des deux et définissez-la comparaison de ces, ou quelque chose de moralement équivalent).
- J'ai unité de tests qui permettent de vérifier l'ensemble du contenu. Mais j'ai aussi ce test qui compare la sortie de deux fonctionne comme un test de cohérence. La sortie dépend, en partie, sur l'ordre des éléments dans un ensemble, mais seulement d'une manière détournée.
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez n'est pas possible. Moyen arbitraire arbitraire.
Ma solution serait la même que la vôtre, vous devez trier le jeu si vous voulez être en mesure de le comparer à un autre.
sorted()
pour un moyen pratique pour écrire les 3 étapes.Utiliser le symmetric_difference (^) opérateur sur vos deux jeux pour voir si il y a des différences:
La raison pour laquelle l'ensemble de l'itération de modifications de la commande de run-to-run semble être parce que Python utilise le hachage de graines de randomisation par défaut. (Voir l'option de commande
-R
.) Ainsi mis à l'itération n'est pas seulement arbitraire (en raison de hachage), mais aussi des non-déterministe (à cause de la graine aléatoire).Vous pouvez remplacer la graine aléatoire avec une valeur fixe en définissant la variable d'environnement PYTHONHASHSEED pour l'interprète. À l'aide de la même graine d'une exécution de moyens mis en itération est toujours arbitraire, mais maintenant il est déterministe, qui était la propriété désirée.
De hachage de graines de randomisation est une mesure de sécurité pour le rendre plus difficile pour un pirate d'intrants de l'alimentation qui sera la cause pathologique du comportement (par exemple, en créant de nombreuses collisions de hachage). Pour les tests unitaires, ce n'est pas un problème, donc il est raisonnable de remplacer la valeur de hachage de la graine lors de l'exécution des tests.
L'ensemble de l'itération de l'ordre ne dépend pas seulement de son contenu, mais sur l'ordre dans lequel les articles ont été insérés dans le jeu, et si il y avait des suppressions en cours de route. Ainsi, vous pouvez créer deux ensembles différents, à l'aide de différentes insertions et suppressions, et jusqu'à la fin avec le même jeu à la fin, mais avec différents itération commandes.
Comme d'autres l'ont dit: si vous vous souciez de l'ordre de l'un, vous devez créer une liste triée d'elle.
Votre question transformé en deux questions: A) comment comparer "la sortie de deux pistes" dans votre cas particulier; B) quelle est la définition de l'itération de l'ordre dans un ensemble. Vous devriez peut-être de les distinguer et de les poster B) en tant que nouvelle question le cas échéant. Je vais répondre à A.
À mon humble avis, à l'aide d'une liste triée dans votre cas n'est pas très propre solution. Vous devez décider si vous vous souciez de l'itération de l'ordre une fois pour toutes et l'utilisation d'une structure appropriée.
Soit 1) que vous souhaitez comparer les deux jeux pour voir si ils ont contenu égal, indépendamment de l'ordre. Ensuite, le simple opérateur == sur les ensembles semble le plus approprié. Voir python2 ensembles, python3 ensembles.
Ou 2) vous voulez vérifier si les éléments ont été insérés dans le même ordre. Mais ce qui semble raisonnable que si l'ordre d'insertion d'une certaine manière les questions pour les utilisateurs de votre bibliothèque, dans le cas où l'utilisation du type de jeu est probablement inapproprié pour commencer. Mettre une autre manière, il est difficile de savoir ce que vous entendez exactement par "en comparant la sortie de deux pistes" et pourquoi vous voulez le faire.
Dans tous les cas, je doute d'une liste triée est approprié ici.
Vous pouvez définir le résultat attendu d'être également un ensemble. Et vérifie si ces deux ensembles sont égaux à l'aide de ==.
Contrairement à des ensembles, listes ont toujours un ordre garanti, de sorte que vous pourrait jeter le paramétrage et l'utilisation de la liste.