2017-08-08 1 views
1

J'ai la structure suivante:état Stocker entre la fonction de module appelle

app/ 
    test1.py 
    test/ 
    __init__.py 
    test2.py 

importer test2.py dans test1.py et utiliser les fonctions de test2.py

Code

est la suivante:

test1.py:

import test.test2 as T 


T.hello() 
... 
T.hello1() 

test2.py:

d = {} 
def hello(): 
    print('hi') 
    global d 
    d['1'] = 1 


def hello1(): 
    print('hi1') 
    global d 
    print(d) # prints{'1': 1} 

test1.py appellera hello et après appel quelque temps hello1. Je veux remplir le dictd en hello et l'utiliser en hello1. En utilisant un global fonctionne très bien, mais quelle est une meilleure façon de le faire puisque je veux éviter globals. Je ne veux pas passer d de hello au caller en test1 et puis de là à hello1.

Que puis-je faire pour éviter globals. J'utilise python 3.5.

+3

Avez-vous une raison pour éviter de mettre les deux fonctions hello dans une classe? Deux fonctions avec l'état partagé semblent être un cas d'utilisation évident pour une classe avec une variable d'instance self.d. – csunday95

+0

Le fichier 'test1.py' sera importé plus haut (contrairement à ma structure que j'ai utilisée pour la simplification) donc je devrais ajouter une classe dans' test1.py' et je veux savoir s'il y a d'autres façon? – PYA

Répondre

3

Vous pouvez simplement utiliser une classe:

class Whatever(object): 
    def __init__(self): 
     self.d = {} 

    def hello(self): 
     print('hi') 
     self.d['1'] = 1 

    def hello1(self): 
     print('hi1') 
     print(self.d) 

_Someinstance = Whatever() 
hello = _Someinstance.hello 
hello1 = _Someinstance.hello1 

au lieu des trois dernières lignes, vous pouvez également créer et utiliser simplement l'instance où vous en avez besoin. Ceux-ci étaient juste inclus pour le faire se comporter (presque) comme votre original.

Notez que les fonctions sont aussi des objets, de sorte que vous pouvez simplement assigner la variable à la fonction hello:

def hello(): 
    print('hi') 
    hello.d['1'] = 1 

def hello1(): 
    print('hi1') 
    print(hello.d) # prints{'1': 1} 

hello.d = {} 
+0

Le fichier 'test1.py' sera importé plus haut (contrairement à ma structure que j'ai utilisée pour la simplification) donc je devrais ajouter une classe dans' test1.py', ce que j'essaie d'éviter. – PYA

+0

Pourquoi? Si vous utilisez exactement le code que j'ai utilisé dans ma réponse, cela devrait fonctionner presque comme l'original. C'est parce que j'ai ajouté les lignes 'hello = _Someinstance.hello' et' hello1 = _Someinstance.hello1'. Si cela ne fonctionne pas, vous devez fournir une description plus précise du problème :) – MSeifert

+1

Si vous ne voulez pas utiliser de classe, vous pouvez faire du dictionnaire un argument de fonction de chacune des fonctions Hello. Passez simplement le même dictionnaire créé dans test1.py, car les dictionnaires sont transmis par référence. – csunday95