J'ai écrit mon code avant de lire d'autres réponses. Après avoir terminé mon code, j'ai trouvé que le code de @Todd est la meilleure réponse.
Quoi qu'il en soit, je poste ma réponse parce que je me sentais amusant pendant que je résolvais ce problème. J'ai appris de nouvelles choses grâce à cette bonne question.
L'inconvénient de mon code est qu'il existe une surcharge pour récupérer les dictionnaires à chaque fois que des fonctions sont appelées.
from collections import defaultdict
import inspect
import os
class PlatformFunction(object):
mod_funcs = defaultdict(dict)
@classmethod
def get_function(cls, mod, func_name):
return cls.mod_funcs[mod][func_name]
@classmethod
def set_function(cls, mod, func_name, func):
cls.mod_funcs[mod][func_name] = func
def linux(func):
frame_info = inspect.stack()[1]
mod = inspect.getmodule(frame_info.frame)
if os.environ['OS'] == 'linux':
PlatformFunction.set_function(mod, func.__name__, func)
def call(*args, **kwargs):
return PlatformFunction.get_function(mod, func.__name__)(*args,
**kwargs)
return call
def windows(func):
frame_info = inspect.stack()[1]
mod = inspect.getmodule(frame_info.frame)
if os.environ['OS'] == 'windows':
PlatformFunction.set_function(mod, func.__name__, func)
def call(*args, **kwargs):
return PlatformFunction.get_function(mod, func.__name__)(*args,
**kwargs)
return call
@linux
def myfunc(a, b):
print('linux', a, b)
@windows
def myfunc(a, b):
print('windows', a, b)
if __name__ == '__main__':
myfunc(1, 2)