1
votes

Comment importer les variables locales d'un fichier dans le module actuel

J'ai cette fonction dans mon module MetaShrine.py

Je ne peux pas utiliser la variable locale first_name_signup . L'erreur est

NameError: name 'first_name_signup' is not defined

Je ne veux pas que chaque variable soit globale. Existe-t-il un moyen d'importer la variable locale d'un autre fichier sans le rendre global?

C'est l'une de mes fonctions dans mon module principal MetaShrine.py

from MetaShrine import *

class test(unittest.TestCase):

    def test_creating(self):
        self.assertIsInstance(first_name_signup, str)

if __name__ == "__main__":
    unittest.main()

Lorsque j'importe ce module dans un nouveau module, en utilisant:

def creating():

    first_name_signup = input("Enter Your First Name\n")
    password_signup = input("Creat a Password\n")

... j'obtiens ceci:

NameError: name 'first_name_signup' is not defined

p>


2 commentaires

Par ailleurs, le test que vous écrivez est redondant car input dans python3 va toujours renvoyer un objet str . Est-ce un vrai test que vous écrivez ou c'est juste un code factice pour ce post?


juste un code factice. Je commence les tests, donc je voulais apprendre la syntaxe et le fonctionnement des tests unitaires.


3 Réponses :


0
votes

En gros, retournez la valeur et placez-la dans une autre variable de l'autre fichier. C'est la meilleure façon de penser.

import MetaShrine 

class test(unittest.TestCase):

    def test_creating(self):
        first_name_signup, password_signup = MetaShrine.creating()

        self.assertIsInstance(first_name_signup, string)

if __name__ == "__main__":
    unittest.main()

Deuxième fichier:

def creating():

    first_name_signup = input("Enter Your First Name\n")
    password_signup = input("Creat a Password\n")

    return first_name_signup, password_signup


2 commentaires

Traceback (dernier appel en dernier): Le fichier "testMetaShrine.py", ligne 9, dans test_creating first_name_signup, password_signup = MetaShrine.creating () AttributeError: l'objet de type 'MetaShrine' n'a pas d'attribut 'creation'


Alors les informations dans votre question ne sont pas exactes, ou peut-être avez-vous mis ce code dans le mauvais fichier? Le traçage dans votre commentaire ressemble à ce que vous avez essayé d ' importer MetaShrine en lui-même.



0
votes

Je pense que c'était une mauvaise idée d'écrire du code de cette manière. je devrais avoir séparé userinput des fonctions. mettre les entrées utilisateur sur le frontend et les opérations sur le backend permettra au programme d'être facilement testable.

c'est ce que j'ai fait plus tard


0 commentaires

0
votes

Je suppose que la bonne façon et pythonique d'écrire des tests unitaires en python est d'importer vos classes , méthodes et fonctions à partir de votre module actuel puis exécutez vos tests sur les objets importés plutôt que d'importer réellement les valeurs ou les variables de return depuis le module.

Donc, dans votre cas, cela devrait ressembler à

code.py

import MetaShrine import creating
import unittest

class test(unittest.TestCase):

    def test_creating(self):
    # actual assert statement for the test case, i.e.
    result, _ = creating()
    self.assertEqual(result, 'some_name')


if __name__ == "__main__":
    unittest.main()

tests.py

def creating():

    first_name_signup = input("Enter Your First Name\n")
    password_signup = input("Creat a Password\n")

    return first_name_signup, password_signup


0 commentaires