gpt4 book ai didi

python - 模块中函数的条件定义

转载 作者:IT老高 更新时间:2023-10-28 21:04:32 26 4
gpt4 key购买 nike

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

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

我找到了另一个 approach其中每个特定于平台的部分都被提取到自己的模块中,然后有条件地导入到 persistenv.py 中(解决方案 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 的行为(内部)如何?

  • SOLUTION 3 似乎更 Pythonic(用于内置实现,例如 os.path),但是 当persistenv.py、persistenv_win.py 和 persistenv_linux.py 是其中的一部分时不会有问题我将通过在主脚本中执行“import my_package”全局导入的相同包(在其他模块中)

最佳答案

如果你看一下 Python 标准库,你会发现这三个都被使用了:

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

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

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

[Solution 1]

how does Python behave (internally) if one needs to call "from persistenv import my_function2"?

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

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

[Solution 3]

can't it be problematic when persistenv.py, persistenv_win.py and persistenv_linux.py are part of a same package (among other modules) which I would globally import by doing "import my_package" in the main script ?

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

关于python - 模块中函数的条件定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com