20

我的问题是关于找到定义根据给定标准实现不同的函数的“好方法”。该函数将从多个脚本中调用,因此我必须将它放在一个模块中。

举例来说,我的标准涉及脚本在哪个平台上运行,但要清楚测试可以适用于任何东西。我的函数允许持久定义/检索环境变量,因此我根据以下方案(解决方案 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”来全局导入哪个

4

1 回答 1

14

如果您查看 Python 标准库,您会发现它们都被使用了:

  • subprocess使用解决方案 1 和 2;有几个地方进行测试。

  • os使用解决方案 3 ( import ... as path) 的变体。

所以使用看起来最合适和最简单的那个。

[解决方案 1]

如果需要调用“ from persistenv import my_function2”,Python 的行为(内部)如何?

它的行为完全符合要求。导入模块时定义的函数被导出。

从技术上讲,模块像 with 一样被导入import module,然后在其命名空间中查找给定名称并将其放入当前名称中。

[解决方案 3]

当persistenv.py、persistenv_win.py 和persistenv_linux.py 是我将通过在主脚本中执行“import my_package”全局导入的同一个包(在其他模块中)的一部分时,这不会有问题吗?

为什么会有问题?您导入my_package主脚本,然后主脚本(或包的一个模块)从依赖于平台的模块执行所述导入。这是完全有效的。

于 2013-04-24T13:11:48.997 回答