Reputation: 840
I want to write a script that will execute on Linux and Solaris. Most of the logic will be identical on both OS, therefore I write just one script. But because some deployed structure will differ (file locations, file formats, syntax of commands), a couple of functions will be different on the two platforms.
This could be dealt with like
if 'linux' in sys.platform:
result = do_stuff_linux()
if 'sun' in sys.platform:
result = do_stuff_solaris()
more_stuf(result)
...
However it seems to cumbersome and unelegant to sprinkle these ifs
throughout the code. Also I could register functions in some dict
and then call functions via the dict. Probably a little nicer.
Any better ideas on how this could be done?
Upvotes: 3
Views: 3284
Reputation: 2243
Solution 1:
You create separate files for each of the functions you need to duplicate and import the right one:
import sys
if 'linux' in sys.platform:
from .linux import prepare, cook
elif 'sun' in sys.platform:
from .sun import prepare, cook
else:
raise RuntimeError("Unsupported operating system: {}".format(sys.platform))
dinner = prepare('pork')
drink_wine()
result = cook(dinner)
Solution 1.5:
If you need to keep everything in a single file, or just don't like the conditional import, you can always just create aliases for the functions like so:
import sys
def prepare_linux(ingredient):
...
def prepare_sun(ingredient):
...
def cook_linux(meal):
...
def cook_sun(meal):
...
if 'linux' in sys.platform:
prepare = prepare_linux
cook = cook_linux
elif 'sun' in sys.platform:
prepare = prepare_sun
cook = cook_sun
else:
raise RuntimeError("Unsupported operating system: {}".format(sys.platform))
dinner = prepare('chicken')
drink_wine()
result = cook(dinner)
Upvotes: 7
Reputation: 43286
You can do it like this:
if 'linux' in sys.platform:
def do_stuff():
result = # do linux stuff
more_stuff(result)
elif 'sun' in sys.platform:
def do_stuff():
result = # do solaris stuff
more_stuff(result)
And then simply call do_stuff()
.
Upvotes: 1