2014-06-18 8 views
0

J'écris une bibliothèque python qui sauvegarde et organise des données scientifiques. Appelons il dataappOrganisation du module python

Je voudrais mettre mon répertoire comme suit:

core/ 
operations/ 
cli_interface.py 

noyau contient toutes les classes de données et la classe d'un référentiel de données, et tout le code est autonome, sans dépendances . Les opérations contiennent toutes les actions, comme l'enregistrement, la mise à jour, la sauvegarde des données, mais les opérations dépendent du noyau. core n'est pas un enfant des opérations et devrait avoir la capacité d'être utilisé seul.

Cependant importer du code du noyau dans les opérations semble être une chose laide parce que je devrais importer des chemins relatifs et des parents.

Une autre option pour l'importation est pour l'installation dataapp sur la machine globalement, dans ce cas les opérations peuvent importer facilement du noyau.

Ma question est la suivante: est-ce que ce qui est recommandé ci-dessus, ou existe-t-il une meilleure façon de présenter mon code?

Répondre

1

Essayez cette mise en page:

core/ 
    __init__.py 
    functions.py 

operations/ 
    __init__.py 
    actions.py 

test.py 

Note:__init__.py fichiers, ils ne sont que des fichiers vides pour définir paquet avec un nom coïncidait avec le nom du répertoire.

functions.py avec des fonctions de base DEFINITIONS:

def core_function(): 
    print "core function" 

Module actions.py aura une telle connexion avec core:

from core import functions 

def simple_action(): 
    functions.core_function() 

Dans votre application test.py vous pouvez l'utiliser comme suit:

from core import functions 
from operations import actions 

functions.core_function() 
actions.simple_action() 

A noter également: que core et operations paquets sont référencés par chemin complet - pas par rapport, à savoir si vous aviez la structure lab.sci.core vous utiliseriez from lab.sci.core et from lab.sci.operations commandes d'importation dans l'application test.py et actions.py module.

+0

cela résout mon problème .... J'utilise maintenant '' 'depuis' 'lab.core import functions''' dans le module des opérations. Mon erreur consistait à utiliser '' 'depuis les fonctions d'importation de base'''. Mais vous avez maintenant éclairci cela pour moi. –

0

La configuration que vous dessinez est parfaitement adaptée. Si chaque module n'était autorisé à importer qu'à partir de ses propres sous-modules (une arborescence stricte), vous ne pourriez jamais partager de code entre les modules. Les structures du module Tidy sont des graphiques acycliques orientés (pas d'importations mutuelles), pas nécessairement des arbres.

+0

comment recommanderiez-vous que je le fais, en installant l'application à l'échelle mondiale et l'importation, ou en utilisant des chemins relatifs? –

+0

@EoinMurray que voulez-vous dire par des chemins relatifs? –

+0

Je dois mettre sys.path.append () dans les opérations. Je ne vois pas comment je peux importer naturellement. –

0

Qu'en est-il:

cli_interface.py 
operations/ 
core 

donc noyau un enfant de fonctionnement, parce que noyau est une donnée à utiliser par le module d'exploitation seulement.

+0

non, peut-être que je n'étais pas clair ... le noyau n'est pas un enfant des opérations seulement. Il devrait être autorisé à être utilisé seul. Je vais mettre à jour la question pour refléter cela. –

+0

@EoinMurray, si c'est le cas, une structure simple sera une meilleure solution. –

0

Il n'y a rien de mal avec votre structure.Mais si vous voulez être plus bavard dans les importations, cela fonctionne aussi:

cli_interface.py 
dataapp/ 
    core/ 
    operations/ 

Ensuite, vous feriez

from dataapp import core