0

我有一个程序,每个操作系统(Linux 和 Windows)都需要不同的变量。每个变量都有一个字典会更好,如下所示:

# 'win'dows and 'lin'ux 
system_root = { "win" : r"C:",
                "lin" : r"/" }

data_folder = { "win" : r"C:\Program Files",
                "lin" : r"/usr/share/applications" }

或每个操作系统变量的单独字典,如下所示:

vars_win = { "system_root" : r"C:",
             "data_folder" : r"C:\Program Files" }

vars_lin = { "system_root" : r"/",
             "data_folder" : r"/usr/share/applications" }

抱歉,如果问题标题对我的意图不是很清楚,我想不出更好的表达方式。

4

2 回答 2

2

我更喜欢第二种解决方案,因为您可以这样做:

if platform == windows:
    vars = win_vars
elif platform == posix:
    vars = lin_vars

然后稍后在您的应用程序中,您不必处理去分支。只需使用vars变量。

注意:我没有指定检查平台的方式,因为根据您的需要有多种方式。您可以检查sys.platform, 使用platform模块或检查posix, nt... 是否在sys.builtin_module_names.

于 2013-09-13T10:12:58.077 回答
0

看起来对这些“变量”的大部分或全部访问都将使用常量键,因此更好的解决方案是使用类层次结构:

class CommonVars:
    pass

class WindowsVars(CommonVars):
    system_root = "C:\\"
    data_folder = "C:\\ProgramData"

class LinuxVars(CommonVars):
    system_root = "/"
    data_folder = "/usr/share/applications"

if platform == windows:
    vars = WindowsVars
elif platform == posix:
    vars = LinuxVars

... do something with vars.system_root ...

如果它看起来有用,您可以将这些扩展为具有系统特定行为方法的成熟类。

此示例中未使用基类,因此它可能完全是多余的,但无论如何我都会包含它,以防在某些时候您想要包含两个平台之间实际上相同但如果您添加支持可能会有所不同的系统属性三分之一。

于 2013-09-13T10:17:35.540 回答