【发布时间】:2012-08-04 09:55:51
【问题描述】:
我需要通过提供多种实现来使模块中的一个功能独立于平台,而无需更改任何导入它的文件。以下作品:
do_it = getattr(__import__(__name__), "do_on_" + sys.platform)
...但是如果将模块放入包中,则会中断。
另一种方法是 if/elif 对 do_it() 中的其他函数进行硬编码调用。
还有更好的吗?
【问题讨论】:
标签: python
我需要通过提供多种实现来使模块中的一个功能独立于平台,而无需更改任何导入它的文件。以下作品:
do_it = getattr(__import__(__name__), "do_on_" + sys.platform)
...但是如果将模块放入包中,则会中断。
另一种方法是 if/elif 对 do_it() 中的其他函数进行硬编码调用。
还有更好的吗?
【问题讨论】:
标签: python
将平台支持代码放在包中的不同文件中。然后将其添加到人们应该从中导入的文件中:
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")
【讨论】:
使用 globals()['do_on_' + platform] 而不是 getattr 调用,无论它是否在包内,您的原始想法都应该有效。
【讨论】:
如果您需要创建一个特定于平台的类实例,您应该查看工厂模式: link text
【讨论】:
Dive Into Python 提供异常选项。
【讨论】: