【问题标题】:How to offer platform-specific implementations of a module?如何提供特定于平台的模块实现?
【发布时间】:2012-08-04 09:55:51
【问题描述】:

我需要通过提供多种实现来使模块中的一个功能独立于平台,而无需更改任何导入它的文件。以下作品:

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

...但是如果将模块放入包中,则会中断。

另一种方法是 if/elif 对 do_it() 中的其他函数进行硬编码调用。

还有更好的吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    将平台支持代码放在包中的不同文件中。然后将其添加到人们应该从中导入的文件中:

    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")
    

    【讨论】:

      【解决方案2】:

      使用 globals()['do_on_' + platform] 而不是 getattr 调用,无论它是否在包内,您的原始想法都应该有效。

      【讨论】:

        【解决方案3】:

        如果您需要创建一个特定于平台的类实例,您应该查看工厂模式: link text

        【讨论】:

          【解决方案4】:

          Dive Into Python 提供异常选项。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 1970-01-01
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多