我需要通过提供几个实现在独立于平台的模块中创建一个函数,而不更改导入它的任何文件。以下作品:如何提供模块的平台特定实现?
do_it = getattr(__import__(__name__), "do_on_" + sys.platform)
...但休息如果模块放到一个包。
另一种方法是使用do_it()中的其他硬编码调用的if/elif。
还好吗?
我需要通过提供几个实现在独立于平台的模块中创建一个函数,而不更改导入它的任何文件。以下作品:如何提供模块的平台特定实现?
do_it = getattr(__import__(__name__), "do_on_" + sys.platform)
...但休息如果模块放到一个包。
另一种方法是使用do_it()中的其他硬编码调用的if/elif。
还好吗?
使用globals()['do_on_' + platform]
,而不是getattr
通话和你最初的想法应该工作,这是否是一个包内或没有。
将平台支持的代码放在包中的不同文件中。然后将其添加到该文件的人都应该从导入:
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")
如果你需要创建一个类,你应该看看进入工厂模式的平台特定实例: link text
Dive Into Python提供例外的选择。
+1:从os包中复制设计模式。 – 2009-04-26 17:13:05