定义具有平台变体的函数的最正确方法



今天我遇到了这个答案,它在确定系统平台定义了一个函数。

我一直假设(或者更确切地说,从未真正考虑过其他情况(确定跨平台函数正确行为的条件应该放在定义

import subprocess
import sys
def show_file(path):
    if sys.platform == "darwin":
        subprocess.check_call(["open", "--", path])
    elif sys.platform == "linux":
        subprocess.check_call(["xdg-open", "--", path])
    elif sys.platform == "win32":
        subprocess.check_call(["explorer", "/select", path])

我很好奇,像 Epp @Dietrich那样做更有效率吗?

if sys.platform == "darwin":
    def show_file(path):
        subprocess.check_call(["open", "--", path])
elif sys.platform == "linux":
    def show_file(path):
        subprocess.check_call(["xdg-open", "--", path])
elif sys.platform == "win32":
    def show_file(path):
        subprocess.check_call(["explorer", "/select", path])

我不知道上述任何一个片段是否有效,但无论如何,这不是问题的一部分。

show_file()函数定义放在条件中的一个结果是,尝试在不受支持的平台上使用此函数将引发NameError。将条件放在 show_file 函数中将导致它静默失败,除非您还在最终else块中包含raise

由你决定哪个更好。就个人而言,我更喜欢在不受支持的平台上出现明显的错误,但我认为为了清楚起见,这可能最好作为最终else条件进行处理,因此异常的原因非常清楚。

这两种情况之间的效率可以忽略不计。我会更关心代码的可读性和异常处理。

第一个版本每次调用show_file时都会执行平台检查;第二个版本不执行。 不过,它可能不会让它慢到重要。

"最佳方法"可能取决于您的优先级。

实现此类操作的一种方法可能是优先考虑可读性,并准备代码以提取抽象。它可能沿着这些思路,如果由于平台不受支持而无法进行正确的函数分配,则会引发异常。

import subprocess
import sys

class UnsupportedPlatformException(Exception):
    pass

def _show_file_darwin():
    subprocess.check_call(["open", "--", path])
def _show_file_linux():
    subprocess.check_call(["xdg-open", "--", path])
def _show_file_win32():
    subprocess.check_call(["explorer", "/select", path])
_show_file_func = {'darwin': _show_file_darwin, 
                   'linux': _show_file_linux,
                   'win32': _show_file_win32}
try:
    show_file = _show_file_func[sys.platform]
except KeyError:
    raise UnsupportedPlatformException

# then call show_file() as usual

相关内容

  • 没有找到相关文章

最新更新