2017-10-20 23 views
0

Je suis confus lorsque j'ai essayé d'écrire moi-même __init__.py après avoir vu le code dans la bibliothèque numpy \ __ init__.py.Comment étendre correctement la variable __all__ dans un __init__.py?

Voici numpy \ __ init__.py extrait de code

__all__.extend(['__version__', 'pkgload', 'PackageLoader', 
      'show_config']) 
__all__.extend(core.__all__) 
__all__.extend(_mat.__all__) 
__all__.extend(lib.__all__) 
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma']) 

Et Ma structure de répertoire est:

app/

...... test.py

. ..... lib1 \

............ __init__.py

............ Lib1File.py

............ sublib1 \

.......... .. ............ __init__.py

............ ............ SubLib1File.py

Le code dans test.py est

from lib1 import * 

if __name__ == "__main__": 
    result1 = Lib1File.add(10, 15) # a simple function in Lib1File.py 
    print(result1) 
    result2 = Sublib1File.mul(10,15) # a simple function in Sublib1File.py 
    print(result2) 

Le code dans lib1 \ __ init__.py est

from . import sublib1 
__all__ = ["Lib1File"] 
__all__.extend(sublib1.__all__) 
print(__all__)     # it can print ['Lib1File', 'Sublib1File'] on console 

Le code lib1 \ sublib1 \ __ init__.py est

__all__ = ["Sublib1File"] 

Mais quand je courais test.py, je me suis une erreur

* Fichier "test.py", ligne 1, dans le module de l'importation lib1 . AttributeError: module 'lib1' n'a pas d'attribut

Mes questions 'Sublib1File' sont

  1. Pourquoi je reçois cette erreur même si __all__ = ['Lib1File', 'Sublib1File'] dans lib1 \ __ init__.py?

  2. Comment est-ce que je devrais le réparer si j'emploie toujours juste une importation from lib1 import *?

  3. Si nous ne pouvons pas résoudre la question 2, quel est le but de __all__.extend(...) en numpy \ __ init__?

Répondre

1

Si vous prenez un autre regard sur le module de haut niveau de numpy __init__ vous verrez que pour chaque from . import xyz qui est utilisé pour étendre __all__ il y a un from .xyz import * correspondant.

L'ajout d'un nom au __all__ d'un module ne fonctionnera pas si l'objet correspondant n'est pas défini dans le module lui-même ou importé d'ailleurs.

Ajouter from .sublib1 import * ci-dessous from . import sublib1 dans lib1/__init__.py.

+0

Oui, j'ai remarqué ça. Mais je n'ai toujours aucune idée de comment résoudre le problème. Pourriez-vous me donner une modification plus spécifique? Merci –

1

@wyatts Extension de répondre, ajoutez la ligne suivante dans lib1/__init__.py:

from .sublib1 import * 

Pour faire fonctionner l'exemple.

0

vous avez raison @Wyatt, @MegaIng.

Je poste ma réponse ici pour les trois questions, juste au cas où d'autres en auraient besoin.

Q1. Pourquoi j'obtiens cette erreur même si __all__ = ['Lib1File', 'Sublib1File'] dans lib1__init__.py?

A1. Parce que vous venez d'ajouter le nom du module à __all__. Mais il n'a pas réellement le module SublibFile dans le répertoire lib1. Donc python ne peut pas trouver la définition du module SublibFile juste par le nom du module.

Q2. Comment est-ce que je devrais le réparer si je l'utilise encore juste import from lib1 import *?

A2. Ajouter une ligne from .sublib1 import * dans lib1/__init__.py. Cela mettra les modules qui sont définis dans __all__ dans lib1\sublib1\__init__.py à lib\ de sorte que python puisse trouver la définition du module de correspondance par le nom du module.

Q3. Quel est le but de __all__.extend(...) en numpy\__init__?

A3. Afin d'étendre la flexibilité __all__.