2017-06-12 6 views
0

J'utilise Spyder 3.1.2 (Python 2.7.13). Dans le cadre du démarrage, la console IPython est définie sur "Automatically load Pylab and NumPy modules".Spyder ne reconnaît pas les termes importés

Quand je veux utiliser la méthode NumPy.zeros (forme), je peux l'appeler dans la console IPython sous forme de zéros:

In [12]: zeros(5) 
Out[12]: array([ 0., 0., 0., 0., 0.]) 

Mon problème vient lorsque vous essayez d'appeler les mêmes zéros fonctionnent à partir d'une fichier python séparé.

Si je crée une UseZeros de fonction() dans un fichier Test1.py

""" 
filename: Test1.py 
""" 

def UseZeros(): 
    return zeros(4) 

Et je l'appelle à partir d'un fichier séparé, Test2.py:

""" 
filename: Test2.py 
""" 

import Test1 

testArr1 = zeros(5) 
testArr2 = Test1.UseZeros() 

Dans ce script, testArr1 = zeros (5) fonctionne bien, mais lorsque j'appelle Test1.UseZeros(), j'obtiens une erreur indiquant que le nom global 'zeros' n'est pas défini. Est-ce que quelqu'un peut m'aider à comprendre pourquoi lors de l'appel de cette fonction, la console IPython ne reconnaît plus la méthode?

La seule référence que je peux trouver à un similar problem a été corrigée dans une version précédente, et était différente de ce que je vis. La raison pour laquelle j'ai besoin que cela fonctionne est que j'importe des fonctions utilisées par quelqu'un d'autre qui a fait un usage intensif de commandes telles que zéros, uns, sin, cos etc., et je ne veux pas avoir à redéfinir tout.

Merci

Répondre

0

(développeur Spyder ici) La possibilité de charger automatiquement les modules Pylab et numpy est prévu pour faciliter le travail interactif dans la console mais il ne vise pas à écrire du code dans l'éditeur parce que le code ne fonctionne pas en dehors de Spyder . J'ai peur de vous le dire, mais ce que votre collègue a fait est une très mauvaise pratique et, à mon humble avis, je pense que le mieux que vous puissiez faire est de lui demander de régler ce problème.

Il n'y a rien que nous puissions faire du côté de Spyder pour corriger ou améliorer cette situation parce que nous ne sommes pas prêts à promouvoir de mauvaises pratiques, désolé.

+0

Merci Carlos, j'apprécie les commentaires. Va travailler sur mon collègue afin que nous puissions passer à une manière plus conventionnelle de structurer le travail. – GarethC

+0

Merci beaucoup pour votre compréhension, je sais que cela pourrait vous prendre un certain temps. –

+0

Pas du tout, j'étais surtout préoccupé par le fait que je ne pouvais pas aller au travail, quelque chose qui devrait l'être. Heureux de savoir qu'il est conçu pour ne pas fonctionner de cette façon :) – GarethC

1

Comme vous l'utilisez, la déclaration import a encore toutes les fonctions et classes nommées dans le module: import numpy, par exemple, vous permettra d'accéder à la classe ndarray comme numpy.ndarray. Si vous souhaitez importer une classe donnée ou fonction dans l'espace de noms de niveau supérieur, vous devez importer spécifiquement:

from numpy import ndarray 

Et si vous écrivez quelque chose de petit et ne sont pas inquiets qui encombrent l'espace de noms , vous pouvez le faire:

from numpy import * 

dans votre cas, les importations automatiques de Spyder, il semble affecter seulement l'espace de noms de niveau __main__, vous aurez donc besoin de mettre des déclarations d'importation appropriées dans tous les modules importés.

+0

Salut Ben Merci pour la réponse. Le problème est que je ne veux pas avoir à modifier le code de mes collègues. Le problème ne semble pas être l'importation, mais la redéfinition des fonctions par exemple, zeros = np.zeros, cos = np.cos etc. Mon code fourni fonctionne si vous ajoutez zeros = np.zeros à Test1. py J'espérais qu'il y aurait un moyen d'utiliser son code sans avoir à ajouter toutes les importations et définitions, vu que je peux habituellement appeler les fonctions sans spécification. – GarethC

+0

Savez-vous comment votre collègue l'a mis en place? En général, je recommande d'appeler simplement 'np.zeros', cela permet de savoir où la fonction est définie/où rechercher la documentation. –

+0

Mon collègue a la même configuration que moi. Mais appelle ses méthodes à partir du même fichier python. Mais je veux appeler ses méthodes à partir de mon propre fichier python, qui est où j'obtiens le problème que j'ai démontré dans mon exemple plus simple. – GarethC