实现效果:
@linux def my_callback(*args, **kwargs): print("Linux 平台函数实现 @ Linux") return @windows def my_callback(*args, **kwargs): print("Windows平台函数实现 @ Windows")
通过装饰器控制函数定义:
1) 不支持一个函数多个装饰器
import sys import platform def _ifdef_decorator_impl(plat, func, frame): if platform.system() == plat: return func elif func.__name__ in frame.f_locals: return frame.f_locals[func.__name__] else: def _not_implemented(*args, **kwargs): raise NotImplementedError( f"Function {func.__name__} is not defined " f"for platform {platform.system()}.") return _not_implemented def windows(func): return _ifdef_decorator_impl('Windows', func, sys._getframe().f_back) def macos(func): return _ifdef_decorator_impl('Darwin', func, sys._getframe().f_back) def linux(func): return _ifdef_decorator_impl('Linux', func, sys._getframe().f_back) @linux def my_callback(*args, **kwargs): print("Linux 平台函数实现 @ Linux") @windows def my_callback(*args, **kwargs): print("Windows平台函数实现 @ Windows") #执行函数 my_callback()
2)支持一个函数多个装饰器
import sys import platform class IfDefDecoratorPlaceholder: def __init__(self, func): self.__name__ = func.__name__ self._func = func def __call__(self, *args, **kwargs): raise NotImplementedError( f"Function {self._func.__name__} is not defined for " f"platform {platform.system()}.") def _ifdef_decorator_impl(plat, func, frame): if platform.system() == plat: if type(func) == IfDefDecoratorPlaceholder: func = func._func frame.f_locals[func.__name__] = func return func elif func.__name__ in frame.f_locals: return frame.f_locals[func.__name__] elif type(func) == IfDefDecoratorPlaceholder: return func else: return IfDefDecoratorPlaceholder(func) def linux(func): return _ifdef_decorator_impl('Linux', func, sys._getframe().f_back) def windows(func): return _ifdef_decorator_impl('Windows', func, sys._getframe().f_back) def macos(func): return _ifdef_decorator_impl('Darwin', func, sys._getframe().f_back) @macos @linux def my_callback(*args, **kwargs): print("Linux 和 MacOS平台函数实现 ") return @windows def my_callback(*args, **kwargs): print("Windows平台函数实现 ") #执行函数 my_callback()