2013-01-04 9 views
5

Wir benutzen die ganze Zeit Python-Import-Mechanismus, um Module und Variablen und andere Sachen zu importieren..aber gibt es irgendetwas, das als Export funktioniert? wie:Gibt es etwas wie Python-Export?

wir Sachen von einem Modul zu importieren:

from abc import * 

so können wir exportieren wie ?:

to xyz export * 

oder Export a, b, c program.py

Ich weiß, dass diese Frage keine typische Frage ist, die hier gestellt werden muss ... aber nur aus Neugier ... Ich habe die Python-Konsole überprüft und es gibt nichts, was als 'Export' existiert ... vielleicht existiert es mit einigem d ifrer Name ..?

+6

Wie genau würde das funktionieren? – NPE

+2

Warum willst du das? – delnan

+0

wie anstelle einer Variablen oder einer Methode aus einer Python-Datei oder Modul exportieren. Warum können wir nicht aus dieser Datei an unser Ziel exportieren, so dass, selbst wenn unser Code öffentlich wird .. weiß niemand, woher die Variablen oder Methoden kommen? Das ist nur ein Aspekt ... meiner Meinung nach .. wenn es einen Import gibt, dann sollte es einen Export geben. :-) – khan

Antwort

7

Importieren Sie zuerst das Modul, in das Sie Zeug exportieren möchten, damit Sie einen Verweis darauf haben. Dann ordnen Sie die Dinge, die Sie als Attribute des Moduls exportieren möchten:

# to xyz export a, b, c 
import xyz 
xyz.a = a 
xyz.b = b 
xyz.c = c 

eine Wildcard Export zu tun, können Sie eine Schleife verwenden:

# to xyz export * 
exports = [(k, v) for (k, v) in globals().iteritems() if not k.startswith("_")] 
import xyz 
for k, v in exports: setattr(xyz, k, v) 

(Beachten Sie, dass wir die Liste der Objekte zu sammeln, um exportiert vor Importieren des Moduls, so dass wir vermeiden können, einen Verweis auf das Modul zu exportieren, das wir gerade in sich selbst importiert haben.)

Dies ist im Grunde eine Form des Affen-Patching. Es hat seine Zeit und seinen Ort. Damit es funktioniert, muss das Modul, das den "Export" ausführt, natürlich selbst ausgeführt werden. Einfach das Modul zu importieren, das gepatcht wird, wird nicht auf magische Weise erkennen, dass irgendein anderer Code es irgendwo patchen wird.