Habs normal überarbeitet. Nun sollte es auch mit Python 2.4 gehen und man kann locals, globals angeben, wobei ich das bisher nie gebraucht hab.
Das ganze nun mit doctest:
Code: Alles auswählen
def import2(from_name, fromlist=None, globals={}, locals={}):
"""
A easy __import__ function.
TODO: Python 2.5 level argument not supported, yet.
Link: http://www.python-forum.de/topic-14591.html (de)
>>> import sys
>>> sys2 = import2("sys")
>>> sys is sys2
True
>>> from time import time
>>> time2 = import2("time", "time")
>>> time is time2
True
>>> from os.path import sep
>>> sep2 = import2("os.path", "sep")
>>> sep is sep2
True
>>> from os import sep, pathsep
>>> sep2, pathsep2 = import2("os", ["sep", "pathsep"])
>>> sep is sep2 ; pathsep is pathsep2
True
True
>>> import2("existiertnicht")
Traceback (most recent call last):
...
ImportError: No module named existiertnicht
>>> import2("os", "gibtsnicht")
Traceback (most recent call last):
...
AttributeError: 'os' object has no attribute 'gibtsnicht
"""
if isinstance(fromlist, basestring):
# Only one from objects name
fromlist = [fromlist]
obj = __import__(from_name, globals, locals, fromlist)
if fromlist==None:
# Without a fromlist
return obj
# get all 'fromlist' objects
result = []
for object_name in fromlist:
try:
result.append(getattr(obj, object_name))
except AttributeError, e:
msg = "'%s' object has no attribute '%s" % (
obj.__name__, object_name
)
raise AttributeError(msg)
if len(result) == 1:
return result[0]
else:
return result
if __name__ == "__main__": # doctest
#~ verbose = False
verbose = True
import doctest
doctest.testmod(verbose=verbose)
Dumm ist irgendwie, das global und local überschrieben werden. Aber wie anders benennen? Wie macht das eigentlich __import__ selbst?
EDIT: Default bei fromlist auf None gesetzt, siehe:
http://www.python-forum.de/post-105719.html#105719
Das ganze verwende ich in PyLucid hier:
http://trac.pylucid.net/browser/trunk/p ... v=1704#L29