如何提供模块的平台特定实现?

5 投票
4 回答
2770 浏览
提问于 2025-04-15 11:15

我需要在一个模块中创建一个函数,让它在不同的平台上都能用,同时不想修改任何引用这个模块的文件。现在的做法是:

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

这样可以工作,但如果把这个模块放到一个包里就不行了。

另外一种方法是用if/elif语句,直接写死调用其他函数的代码在do_it()里面。

有没有更好的办法呢?

4 个回答

1

Dive Into Python 提供了处理异常的另一种方法。

5

把不同平台支持的代码放在你包里的不同文件中。然后把这个内容加到人们应该从中导入的文件里:

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 的调用,这样你的原始想法就可以在包里面或者外面都能正常工作。

撰写回答