2016-04-26 7 views
0

Ich erstelle ein Modul GUI (beschreibt eine grafische Schnittstelle), die ein anderes Modul benötigt somecalc (einige Berechnungen). Die letztgenannten Einfuhren Standardbibliotheken: os, sys, time usw.Andere Submodule importieren & Standard-Lib ignorieren

Das Ziel ist, ein Paket am Ende zu bauen.

Ich kann nicht die Konventionen finden andere Submodule in einem Paket in Bezug auf den Import und/oder andere selbst entwickelte Module:

  1. ohne den Namensraum unübersichtlich (und die automatische Vervollständigung in IPython):

    • ich will nicht somecalc.os, somecalc.sys, somecalc.time
  2. sehen
  3. ohne Standardbibliotheken erneut zu importieren, die bereits in somecalc

    • importiert wurden, auch wenn ich die Ausgabe # 1 von writting import os as _os in somecalc.py beheben, ich habe zwei Möglichkeiten, das gleiche zu tun. Wenn ich die folgenden Tests innerhalb GUI:
    • somecalc.os is os #TRUE (mit import os in somecalc.py)
    • somecalc._os is os #TRUE (keine automatische Vervollständigung von IPython mit import os as _os in somecalc.py)
  4. ohne lästige Anrufe zu Standard-Bibliothek, z.B. schreibe somecalc.os.listdir wenn ich einfach os.listdir schreiben könnte. Außerdem glaube ich nicht, dass es klar ist, ob andere Entwickler mit mir an dem Projekt arbeiten werden.

Ich weiß, dass, wenn ich meine Ordner in ein Paket drehen möchte ich geraten bin eine __init__.py Datei mit allen meinen Importe hinzuzufügen. Aber wenn ich Submodule entwickle/debugge (mit Code unter if __name__ = '__main__'), wird die __init__.py Datei im Stammverzeichnis ignoriert. Außerdem muss ich noch import somecalc am Anfang meiner GUI.py Datei schreiben.

Was sind die Konventionen?

Antwort

1

In Ihrem __init__.py nur aussetzen, was Sie benötigen, um zu belichten. Erstelle andere .py, die die Standardbibliotheken benötigen, und importiere, was du brauchst.

$ tree GUI/ 
GUI 
├── __init__.py 
└── somecalc 
    ├── __init__.py 
    ├── somecalc.py 

$ cat GUI/__init__.py 
import somecalc 

$ cat GUI/somecalc/__init__.py 
from somecalc import get_time 

$ cat GUI/somecalc/somecalc 
import os 
import sys 
import time 

def get_time(): 
    return time.time() 

diese Weise, wenn Sie somecalc importieren, müssen Sie nur get_time und die somecalc Submodul sehen:

$ python 
Python 2.7.9 (default, May 20 2015, 15:38:28) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import GUI 
>>> dir(GUI) 
[..., 'somecalc'] 
>>> dir(GUI.somecalc) 
[..., 'get_time', 'somecalc'] 
>>> dir(GUI.somecalc.somecalc) 
[..., 'get_time', 'os', 'sys', 'time'] 
>>> 
+0

Ihre Lösung mich nicht zulässt, dass die Standardbibliotheken von GUI zuzugreifen oder in einem umständlichen Art und Weise: jetzt wurde somecalc.os.listdir zu einem gewissen Grad. – Wli

+0

Zugriff auf Standardbibliotheken mit einem 'Import-System'? Was ist das Problem ? – Cyrbil

+0

Ich bin mir nicht sicher, deshalb frage ich die Konvention. Also auch wenn ein Modul "x" bereits in ein Submodul "sm" importiert wurde, muss ich immer noch "x" in alle Module importieren, die bereits "sm" importieren, oder? Dies ist, was ich seltsam finde, wie ich nie Standardbibliotheken unter Verzeichnis heruntergeladener Module gefunden habe. – Wli