Python 使用平台变体定义函数的最正确方法

Python 使用平台变体定义函数的最正确方法,python,python-3.x,correctness,Python,Python 3.x,Correctness,今天我遇到了一个函数,它在确定了系统平台之后定义了一个函数 我一直认为,或者说,从来没有真正考虑过,确定跨平台函数正确行为的条件应该放在定义中 导入子流程 导入系统 def show_文件路径: 如果sys.platform==达尔文: 子进程检查调用[打开,-,路径] elif sys.platform==linux: 子进程检查调用[xdg open,-,path] elif sys.platform==win32: 子进程。检查\u调用[explorer,/select,path] 我很好

今天我遇到了一个函数,它在确定了系统平台之后定义了一个函数

我一直认为,或者说,从来没有真正考虑过,确定跨平台函数正确行为的条件应该放在定义中

导入子流程 导入系统 def show_文件路径: 如果sys.platform==达尔文: 子进程检查调用[打开,-,路径] elif sys.platform==linux: 子进程检查调用[xdg open,-,path] elif sys.platform==win32: 子进程。检查\u调用[explorer,/select,path] 我很好奇,像@Dietrich Epp那样做是否更有效

如果sys.platform==达尔文: def show_文件路径: 子进程检查调用[打开,-,路径] elif sys.platform==linux: def show_文件路径: 子进程检查调用[xdg open,-,path] elif sys.platform==win32: def show_文件路径: 子进程。检查\u调用[explorer,/select,path]
我不知道上面的代码片段是否有效,但不管怎样,这并不是问题的一部分。

第一个版本在每次调用show\u文件时都执行平台检查;第二个没有。不过,这可能不会使其速度慢到足以产生影响。

将show_file函数定义放入条件中的一个后果是,尝试在不受支持的平台上使用此函数将引发命名错误。将条件放在show_file函数中会导致该函数以静默方式失败,除非在最后一个else块中也包含提升

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


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

最好的方法可能取决于您的优先级

这样做的一种方法可能是优先考虑可读性,并准备代码以提取抽象。可能是这样,如果由于平台不受支持而无法进行适当的函数分配,则会引发异常

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

你只是告诉我我已经知道的,我问的是效率和正确性。我知道它是如何工作的,但你会选择哪一个?那么你不应该问它是否更有效。虽然我很荣幸你会关心我的意见,但仅此而已。投票结束我自己的问题,因为公认的答案和其他人的评论表明,这主要是基于意见的。