9
votes

Importerror moqueur en python

J'essaye cela pendant près de deux heures maintenant, sans chance.

J'ai un module qui ressemble à ceci: p> xxx pré>

plus tard dans le code: P>

>>> ao.shorturl.zope.component  # why?! 
<module ...>


0 commentaires

3 Réponses :


10
votes

juste monkeyychatch dans le intégré Votre propre version de __ importer __ - il peut élever tout ce que vous souhaitez quand il reconnaît qu'il est appelé sur les modules spécifiques pour lesquels vous souhaitez erreurs maquillées. Voir The Docs pour un détail copieux. Grossièrement: xxx

au lieu du ... , vous pouvez connecter nom == 'zope.component' ou organiser des choses Plus de flexibilité avec un rappel de votre choix qui peut rendre les importations à soulever de la demande dans différents cas, en fonction de vos besoins de test spécifiques, sans vous demander de coder plusieurs __ importer __ -alike fonctions; -).

Notez également que si ce que vous utilisez, au lieu de importer zope.commonent ou de zope.component importer quelque chose , est du composant d'importation de Zope , le nom sera alors 'zope' et '' composant ' sera alors le seul élément du from Llist < / Code>.

EDIT : Les DOCS pour le __ Importer __ Fonction Dites que le nom à l'importation est intégré (comme Dans Python 3), mais en fait, vous avez besoin __ cométine __ - J'ai modifié le code ci-dessus afin qu'il fonctionne de toute façon.


13 commentaires

Ah merci! Pour une raison quelconque, j'ai essayé de faire def __import __ () , mais je ne l'ai pas attribué à intégré .__ importer __ ; que je suis bête. Intéressant, je lisais juste votre réponse ici: Stackoverflow.com/Questtions/2216828/... - Pensez-vous que cela faciliterait cette situation si je n'importerait pas la querité de mon module portée?


@Atttila, si vous avez fait de zope importateur composant , puis utilisé composant.Quéryutilité , il faciliterait la tâche, par exemple, d'utiliser la vraie chose de l'heure, et une version moquée / fausse à d'autres moments. Comme je l'ai écrit dans cette réponse, je le recommande comme une chose générale, et cela fait partie de la manière dont nous codons Python sur Google (parfois une clause comme pour raccourcir le nom des importations est justifiée, bien sûr , mais cela ne change pas la sémantique).


Si vous faites à partir du composant d'importation Zope , BTW, votre __ Importer __ -alike fonctionnera 'zope' comme nom > argument, et 'composant' en tant qu'élément de l'argument from llist (le seul, sauf si vous ne le faites de zope importe ceci, ce qui, le composant ou similaire ;-); alors assurez-vous de déclencher en conséquence.


Merci pour la recommandation, j'adopterai ce style de codage, car il semble être utile dans des cas comme celui-ci. Cependant, je viens de me rendre compte que vous ne répondiez pas pour moi (cela fonctionne sur la console interactive, si je substitue intégré avec __ intégré __ .)


C'est intégré - j'ai orthographié juste dans le texte mais faux dans le code. Édition à réparer.


Ok, c'est bizarre. Importation Construits lève un IMPORTERROR ON PYTHON2. {5.4,6.4,7A4 +} , mais cela fonctionne bien dans python3. {1.1, 2a0} . 2.5, 2.6 et 3.1 sont fournis par Gentoo Ebuilds, mais 2,7 et 3.2 sont mes propres bâties du coffre. Comment se fait-il manquer le module intégré ?


Cependant, selon Ce , vous avez raison, il devrait être Construits .


Importation __builtine __ Fonctionne dans 2.5 - NO S , "Nom magique" (contradicitant les docs). Éditer à nouveau pour réparer.


Génial, maintenant cela fonctionne bien dans la console; Mais ne fonctionnant toujours pas lorsqu'il est utilisé comme doctest dans un fichier texte. Quoi qu'il en soit, cela pourrait être un zope.tsting problème (bien que pas sûr). En attendant, j'ai essayé ceci: Classe Nozope (Objet): DEF Find_Module (Self, Pleinname, Chemin): Si Full Name.Startswith ('Zope'): Soulevez ImporterRor Import Sys.Path.insert (0, Nozope ( )) Et cela fonctionne bien pour l'espace de noms de la suite de tests (= pour toutes les importations dans shorturl.txt ), mais il n'est pas exécuté dans mon module principal, ao.shorturl . Pas même lorsque je recharger () it. Une idée pourquoi?


Hélas, Zope est profond, sombre et mystérieux (je pense qu'il joue des astuces avec des crochets d'importation et autres, pour votre "commodité"), donc je ne sais pas vraiment (mais je sais que vous devriez éditer votre q pour inclure ce code pour inclure ce code Donc, vous pouvez le rendre lisible - dans le commentaire, il est essentiellement illisible en raison du manque de formatage, et il n'y a pas de solution, sauf le déplacer vers le Q! -).


Ne sois pas si mal. Zope n'est pas sombre, c'est beau. Mais c'est toujours profond et mystérieux :) Alors alors, une dernière question. Connaissez-vous une autre recette de construction pour les tests en cours d'exécution, autres que Zope.Testing? Quelque chose avec un bon soutien de la couverture.


Dark and Beautiful n'est pas Antonymes, CFR darkisbeautiful.in ! Je n'ai aucune expérience pratique avec la construction, ne pas les recettes de Buildout.org/docs/ récipeliste.html aide?


Pas vraiment, puisque la plupart (sinon toutes) des tests du Zope World s'appuient sur zope.tsting . Cependant, il peut être facile d'écrire une recette pour un autre test de test, s'il existe un. Je vais essayer peut-être. Quoi qu'il en soit, merci pour toute votre aide Alex et pour garder ce fil vivant!



3
votes

C'est ce que j'ai jeté dans mes instances.

Il utilise PEP-302" Nouveaux crochets d'importation ". (AVERTISSEMENT: Le document Pep-302 et les notes de publication plus concises que j'ai liées ne sont pas exactement précises .)

i utilisent meta_path car c'est comme c'est tôt possible dans la séquence d'importation.

si le module a déjà été importé (comme dans mon cas, car il est donc nécessaire de la simuler à l'encontre), il est nécessaire de le supprimer de Sys.Modules avant de faire le < Code> recharger sur le module dépendant. xxx

où le code à l'intérieur de pif.index ressemble à: xxx < HR>

Pour répondre à la question sur la raison pour laquelle le module nouvellement rechargé comporte des propriétés des anciennes et de nouvelles charges, voici deux exemples de fichiers.

Le premier est un module y avec un cas de défaillance d'importation. xxx

la seconde est x qui démontre comment le départ des poignées sur un module peut affecter ses propriétés lors de la rechargeée. < / p> xxx


2 commentaires

Génial, maintenant j'ai réussi à élever un importerror , qui est tout ce dont j'ai besoin. La chose intéressante est la suivante: si je recharge ao.shorturl , et je ai essayer: import zope.component, zope.interface; Sauf Importerror: Fallback () , et je reçois le premier importerror pour zope.commonent , zope.interface sera toujours disponible dans ao.shorturl (ao.shorturl.zope.interface) . Pourquoi donc?


Je viens d'ajouter une section supplémentaire décrivant pourquoi cela se produit. tl; dr, vous devez del ao.shorturl avant votre recharger .



0
votes

Si cela ne vous dérange pas de changer votre programme lui-même, vous pouvez également mettre l'appel à l'importation dans une fonction et un correctif dans vos tests.


0 commentaires