242 votes

Comment puis-je résoudre ce problème ?

Mon colis a la structure suivante:

mobilescouter/
    __init__.py #1
    mapper/
        __init__.py  #2
        lxml/
            __init__.py #3
            vehiclemapper.py
            vehiclefeaturemapper.py
            vehiclefeaturesetmapper.py
        ...
        basemapper.py
   vehicle/
        __init__.py #4
        vehicle.py
        vehiclefeature.py
        vehiclefeaturemapper.py
   ...

Je ne suis pas sûr de savoir comment l' __init__.py fichiers doit être écrit correctement.
L' __init__.py #1 ressemble:

__all__ = ['mapper', 'vehicle']
import mapper
import vehicle

Mais comment par exemple __init__.py #2 ? Le mien est:

__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml

Quand doit-être __all__ utilisé?

183voto

Fire Crow Points 2273

__all__ est très bonne, elle permet de guider les instructions d'importation sans import automatique des modules http://docs.python.org/tutorial/modules.html#importing-from-a-package

à l'aide de __all__ et import * est redondant, seulement __all__ est nécessaire

Je pense que l'une des raisons les plus importantes pour utiliser import * en __init__.py d'importer des paquets est d'être capable de refactoriser un script qui a grandi dans plusieurs scripts sans casser une application existante. Mais si votre conception d'un package à partir du début. Je pense qu'il est préférable de le laisser en __init__.py des fichiers vides.

par exemple:

foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo

puis l'application se développe et il est maintenant un dossier complet,

foo/
    __init__.py
    foofactories.py
    tallFoos.py
    shortfoos.py
    mediumfoos.py
    santaslittlehelperfoo.py
    superawsomefoo.py
    anotherfoo.py

ensuite, le script d'initialisation peut dire

__all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos',
           'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo']
# deprecated to keep older scripts who import this from breaking
from foo.foofactories import fooFactory
from foo.tallfoos import tallFoo
from foo.shortfoos import shortFoo

de sorte qu'un script écrit pour effectuer les opérations suivantes ne casse pas lors de la modification:

from foo import fooFactory, tallFoo, shortFoo

126voto

Alex Martelli Points 330805

Mon propre __init__.py fichiers sont vides le plus souvent. En particulier, je n'ai jamais une from blah import * dans le cadre de l' __init__.py -- si "l'importation du package" signifie obtenir toutes sortes de classes, fonctions, etc directement défini dans le cadre du paquet, alors je lexicalement copier le contenu de blah.py dans le paquet de l' __init__.py au lieu et retirez blah.py (la multiplication des fichiers source n'est pas bonne ici).

Si vous n'insistez sur le soutien de l' import * idiomes (eek), puis à l'aide de __all__ (avec minuscule d'une liste de noms que vous pouvez apporter vous-même à avoir en elle) peut aider pour le contrôle des dommages. En général, les espaces de noms et explicite les importations sont de bonnes choses, et j'ai de solides suggèrent d'envisager toute approche basée sur l'systématiquement en contournant un ou l'autre ou les deux concepts!-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X