tags:

views:

53

answers:

4

I need to make one function in a module platform-independent by offering several implementations, without changing any files that import it. The following works:

do_it = getattr(__import__(__name__), "do_on_" + sys.platform)

...but breaks if the module is put into a package.

An alternative would be an if/elif with hard-coded calls to the others in do_it().

Anything better?

+2  A: 

Put the code for platform support in different files in your package. Then add this to the file people are supposed to import from:

if sys.platform.startswith("win"):
    from ._windows_support import *
elif sys.platform.startswith("linux"):
    from ._unix_support import *
else:
    raise ImportError("my module doesn't support this system")
Benjamin Peterson
+1: Copy the design pattern from the os package.
S.Lott
+1  A: 

Use globals()['do_on_' + platform] instead of the getattr call and your original idea should work whether this is inside a package or not.

Alex Martelli
A: 

If you need to create a platform specific instance of an class you should look into the Factory Pattern: link text

optixx
A: 

Dive Into Python offers the exceptions alternative.

901