Python 使用平台变体定义函数的最正确方法
今天我遇到了一个函数,它在确定了系统平台之后定义了一个函数 我一直认为,或者说,从来没有真正考虑过,确定跨平台函数正确行为的条件应该放在定义中 导入子流程 导入系统 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]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] 我很好
我不知道上面的代码片段是否有效,但不管怎样,这并不是问题的一部分。第一个版本在每次调用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
你只是告诉我我已经知道的,我问的是效率和正确性。我知道它是如何工作的,但你会选择哪一个?那么你不应该问它是否更有效。虽然我很荣幸你会关心我的意见,但仅此而已。投票结束我自己的问题,因为公认的答案和其他人的评论表明,这主要是基于意见的。