2017-09-30 3 views
0

J'ai un fichier appelé functions.py dans mon répertoire de projet qui contient quelques fonctions simples.ne fonctionne pas correctement la fonction Python lors de l'importation, que lorsqu'elle est définie localement

L'une de ces fonctions (load()) est censé créer des variables globales sans demander à l'utilisateur de les définir au préalable.

Quand j'importer les fonctions du fichier en utilisant

from functions import load 

Il ne fonctionne pas correctement, ce qui signifie les variables globales ne sont pas créés.

Cependant, lorsque je copie coller la fonction pour définir au lieu d'importer à partir du fichier, il fonctionne correctement. Voici la fonction complète:

def load(cnv): 

    global hd1, hd2, variables, datapoints 
    hd1, hd2, variables, datapoints = [], [], [], [] 

    o = open(cnv) 
    r = o.readlines() 
    o.close() 

    for line in r: 
     if not line: 
      pass 
     elif line.startswith('*'): 
      hd1.append(line) 
     elif line.startswith('#'): 
      hd2.append(line) 
      if line.startswith('# name'): 
       line = line.split() 
       variables.append(line[4]) 
     else: 
      float_list = [] 
      line = line.split() 
      for item in line: 
       float_list.append(float(item)) 
      datapoints.append(float_list) 

    datapoints = filter(None, datapoints) 

    global df 
    df = pd.DataFrame(datapoints, columns = variables) 

Par ailleurs il y a un tiret dans le corps de la fonction après l'instruction def(). Je ne suis pas sûr pourquoi il n'apparaît pas quand je le colle dans ce post.

Je suis très nouveau à la programmation, donc je prends des suggestions sur la façon d'améliorer potentiellement ce code.

Merci d'avance.

+0

Salut Christian, merci pour l'entrée. Cependant, lorsque je tente: def foo(): global a a = 25 si je lance: f() et tapez impression (a) La sortie est 25, même si Je n'ai pas défini un avant. Ce qui signifie qu'il a créé un «global» à partir de l'intérieur de la fonction. –

+0

@ViniSalazar pouvez-vous également coller comment vous essayez d'utiliser les variables globales. Vous devriez essayer functions.hd1 pour accéder à – Harry

+0

@ViniSalazar Ne tenez pas compte de mon commentaire précédent. Je n'avais pas utilisé 'global' depuis un moment, et j'étais rouillé sur les détails. –

Répondre

2

Les variables « globales » ne sont pas vraiment à la portée mondiale du script entier. Ce n'est pas PHP.

Python a une structure de tout les espaces de noms par module. Les variables sont "globales" à la portée du module, où cette fonction est déclarée. Ainsi, lorsque vous importez la fonction et appelez-la, elle crée les variables auxquelles vous pouvez accéder comme functions.hd1, functions.hd2, etc.

+0

merci beaucoup. cela répond pourquoi il ne fonctionnait pas lors de l'importation à partir du fichier de fonctions. Cependant, savez-vous comment je pourrais le modifier afin que je puisse y accéder seulement en tapant "hd1", "hd2", etc? J'essaie de rendre les choses plus faciles pour l'utilisateur final, ce que je faisais auparavant était de faire des variables locales mais l'utilisateur devrait appeler la fonction comme ceci: hd1, hd2, variables, points de données, df = load ('monfichier') –

+0

désolé, je viens d'essayer cela et il est revenu: NameError retraçage (appel le plus récent en dernier) dans () ----> 1 functions.hd1 NameError: le nom 'functions' n'est pas défini –

+0

Non. Ceci est contraire à l'idée Python des modules et des espaces de noms par module. Vous ne pouvez pas avoir de nom personnalisé dans tous les modules sans l'importer. –

0

Cela dépend de la façon dont vous l'utilisez. Pour utiliser global, vous devez d'abord appeler la fonction load pour initialiser les variables, après quoi vous pouvez l'utiliser en utilisant package.variable.

Veuillez trouver ci-dessous l'implémentation.

#functions.py 
def load(): 
    global hd1 
    hd1 = [] 

#test.py 
import functions 
functions.load() 
functions.hd1.append('hey') 
print functions.hd1 

OU

#test.py 
from functions import load 
load() 
from functions import * 
hd1.append('hey') 
print hd1 
+0

merci. faites-vous s'il y a un moyen que je peux appeler la variable sans avoir à taper «fonctions». avant? juste en tapant le nom de la variable? –

+0

Vérifiez la réponse mise à jour. Mais besoin de se rappeler les déclarations tout en écrivant le programme et facile de le casser. Il est donc préférable d'utiliser la manière recommandée avec le nom de fichier. – Harry

+0

ok merci Harry :) –