我的问题是关于找到定义根据给定标准实现不同的函数的“好方法”。该函数将从多个脚本中调用,因此我必须将它放在一个模块中。
举例来说,我的标准涉及脚本在哪个平台上运行,但要清楚测试可以适用于任何东西。我的函数允许持久定义/检索环境变量,因此我根据以下方案(解决方案 1)创建了一个名为 persistenv.py 的模块:
# CROSS-PLATFORM PART
def my_function1() :
# ... body1 ...
# WINDOWS-ONLY PART
if sys.platform.lower().startswith('win') :
def my_function2() :
# ...body2 for Windows...
# LINUX-ONLY PART
elif sys.platform.lower().startswith('linux') :
def my_function2() :
# ...body2 for Linux...
else :
raise ImportError('Your platform is not supported')
上面介绍了单个模块中相同功能的两种可能定义。无论如何,这对我来说听起来比每次调用函数时都测试平台要干净得多(解决方案 2):
# CROSS-PLATFORM PART
def my_function1() :
# ... body1 ...
def my_function2() :
# WINDOWS-ONLY PART
if sys.platform.lower().startswith('win') :
# ...body2 for Windows...
# LINUX-ONLY PART
elif sys.platform.lower().startswith('linux') :
# ...body2 for Linux...
我发现了另一种方法,其中每个特定于平台的部分都被提取到自己的模块中,然后有条件地导入到 persistenv.py (SOLUTION 3) 中:
# CROSS-PLATFORM PART
def my_function1() :
# ... body1 ...
# WINDOWS-ONLY PART
if sys.platform.lower().startswith('win') :
from persistenv_win import my_function2
# LINUX-ONLY PART
elif sys.platform.lower().startswith('linux') :
from persistenv_linux import my_function2
else :
raise ImportError('Your platform is not supported')
到目前为止,我得出了以下结论(并得到了以下问题):
几乎不应该使用解决方案 2,特别是如果您有几个特定于平台的函数 my_function2、my_function3、my_function4...(因为您必须在每个函数中重复测试)
解决方案 1 看起来很简单(没有额外的文件,一个测试),但我想知道如果需要调用 "from persistenv import my_function2",Python 的行为(内部)如何?
解决方案 3 似乎更 Pythonic(用于内置实现,例如 os.path),但是当 persistenv.py、persistenv_win.py 和 persistenv_linux.py 是同一包的一部分(在其他模块中)时,这不会有问题我会通过在主脚本中执行“import my_package”来全局导入哪个?