web-dev-qa-db-fra.com

Python: Comment importer toutes les variables?

Je suis nouveau sur Python et la programmation en général (quelques semaines au plus).

Concernant Python et en utilisant des modules, je me rends compte que les fonctions peuvent être importées en utilisant from a import *.

Donc au lieu de taper

a.sayHi()
a.sayBye()

Je peux dire

sayHi()
sayBye()

que je trouve simplifie beaucoup les choses. Maintenant, disons que j'ai un tas de variables que je veux utiliser entre les modules et je les ai tous définis dans un module python. Comment puis-je, en utilisant un similaire comme mentionné ci-dessus ou une méthode tout aussi simple, importez ces variables. Je ne veux pas utiliser import a puis être obligé de préfixer toutes mes variables avec a..

La situation suivante serait idéalement:

a.py

name = "Michael"
age = 15

b.py

some_function

if name == "Michael":
    if age == 15:
        print("Simple!") 

Production:

Simple!
34
user133446

Vous avez donné la solution vous-même: from a import * fonctionnera très bien. Python ne fait pas de différence entre les fonctions et les variables à cet égard.

>>> from a import *
>>> if name == "Michael" and age == 15:
...     print('Simple!')
...
Simple!
61
Stephan202

Juste pour un certain contexte, la plupart des linters marqueront from module import * avec un avertissement, car il est sujet à des collisions d'espace de noms qui provoqueront des maux de tête sur la route.

Personne n'a encore noté que, comme alternative, vous pouvez utiliser le

from a import name, age

puis utilisez name et age directement (sans le a. préfixe). Le from [module] import [identifiers] le formulaire est plus à l'épreuve du temps car vous pouvez facilement voir quand une importation en remplacera une autre.

Notez également que les "variables" ne sont pas différentes des fonctions dans Python en termes de la façon dont elles sont adressées - chaque identifiant comme name ou sayBye est pointant sur une sorte d'objet. L'identifiant name pointe sur un objet chaîne, sayBye pointe sur un objet fonction et age pointe sur un objet entier. vous dites à Python:

from a import name, age

vous dites "prenez ces objets pointés par name et age dans le module a et pointez-les dans la portée actuelle avec les mêmes identificateurs".

De même, si vous souhaitez les pointer avec des identifiants différents lors de l'importation, vous pouvez utiliser le

from a import sayBye as bidFarewell

forme. Le même objet fonction est pointé, sauf dans la portée actuelle, l'identifiant pointant vers lui est bidFarewell alors que dans le module a l'identifiant pointant vers lui est sayBye.

33
cdleary

Comme d'autres l'ont dit,

from module import *

importera également les variables des modules.

Cependant, vous devez comprendre que vous n'importez pas des variables, juste des références à des objets. Attribuer autre chose aux noms importés dans le module d'importation ne sera pas affecte les autres modules.

Exemple: supposez que vous avez un module module.py contenant le code suivant:

a= 1
b= 2

Ensuite, vous avez deux autres modules, mod1.py et mod2.py qui font les deux:

from module import *

Dans chaque module, deux noms, a et b sont créés, pointant vers les objets 1 et 2, respectivement.

Maintenant, si quelque part dans mod1.py vous attribuez autre chose au nom global a:

a= 3

le nom a dans module.py et le nom a dans mod2.py pointera toujours sur l'objet 1.

Donc from module import * fonctionnera si vous voulez des globaux en lecture seule, mais cela ne fonctionnera pas si vous voulez des globaux en lecture-écriture. Dans ce dernier cas, il vaut mieux importer simplement import module puis obtenir la valeur (module.a) ou en définissant la valeur (module.a= …) préfixé par le module.

13
tzot

Vous ne l'avez pas dit directement, mais je suppose que vous avez du mal à manipuler ces variables globales.

Si vous manipulez des variables globales à l'intérieur d'une fonction, vous devez les déclarer globales

a = 10
def x():
   global a
   a = 15

print a
x()
print a

Si vous ne le faites pas, alors a = 15 va simplement créer une variable locale et lui affecter 15, tandis que le global a reste 10

8
hasen