anaconda对python字典的运用(一)定义安装步骤的数据结构类

在图形安装方式下,定义步骤时,在gui.py中有如下一个字典。
stepToClass = {
    "language" : ("language_gui", "LanguageWindow"),
    "agreement" : ("agreement_gui", "AgreementWindow"),
    "keyboard" : ("keyboard_gui", "KeyboardWindow"),
    "mouse" : ("mouse_gui", "MouseWindow"),
    "welcome" : ("welcome_gui", "WelcomeWindow"),
    "installtype" : ("installpath_gui", "InstallPathWindow"),
    "zfcpconfig" : ("zfcp_gui", "ZFCPWindow"),
    "partitionmethod" : ("partmethod_gui", "PartitionMethodWindow"),
    "partition" : ("partition_gui", "PartitionWindow"),
    "autopartition" : ("partition_gui", "AutoPartitionWindow"),
    "findinstall" : ("examine_gui", "UpgradeExamineWindow"),
    "addswap" : ("upgrade_swap_gui", "UpgradeSwapWindow"),
    "upgrademigratefs" : ("upgrade_migratefs_gui", "UpgradeMigrateFSWindow"),
    "fdisk" : ("fdisk_gui", "FDiskWindow"),
    "bootloader": ("bootloader_main_gui", "MainBootloaderWindow"),
    "bootloaderadvanced": ("bootloader_advanced_gui", "AdvancedBootloaderWindow"),
    "upgbootloader": ("upgrade_bootloader_gui", "UpgradeBootloaderWindow"),
    "network" : ("network_gui", "NetworkWindow"),
    "firewall" : ("firewall_gui", "FirewallWindow"),
    "timezone" : ("timezone_gui", "TimezoneWindow"),
    "accounts" : ("account_gui", "AccountWindow"),
    "authentication" : ("auth_gui", "AuthWindow"),
    "desktopchoice": ("desktop_choice_gui", "DesktopChoiceWindow"),
    "package-selection" : ("package_gui", "PackageSelectionWindow"),
    "indivpackage" : ("package_gui", "IndividualPackageSelectionWindow"),
    "dependencies" : ("dependencies_gui", "UnresolvedDependenciesWindow"),
    "videocard" : ("xconfig_gui", "XConfigWindow"),
    "monitor" : ("xconfig_gui", "MonitorWindow"),
    "xcustom" : ("xconfig_gui", "XCustomWindow"),
    "confirminstall" : ("confirm_gui", "InstallConfirmWindow"),
    "confirmupgrade" : ("confirm_gui", "UpgradeConfirmWindow"),
    "finishxconfig" : None,
    "install" : ("progress_gui", "InstallProgressWindow_NEW"),
    "bootdisk" : ("bootdisk_gui", "BootdiskWindow"),
    "complete" : ("congrats_gui", "CongratulationWindow"),
}
而要谈到以后的调用,我们还得从另外一个文件的列表说起:那就是disptch.py中的
installSteps = [
    ("welcome", ()),
    ("betanag", betaNagScreen, ("intf", "dir")),
    ("language", ("intf", "id")),
    ("agreement", ("intf", "id", "dispatch")),
    ("keyboard", ("id.instLanguage.getDefaultKeyboard()", "id.keyboard")),
    ("checkmonitorok", checkMonitorOK, ("id.monitor", "dispatch")),
    ("monitor", ("id.xsetup", "id.monitor", "intf")),
    ("setsanex", setSaneXSettings, ("id.xsetup",)),
    ("findrootparts", findRootParts, ("intf", "id", "dispatch", "dir", "instPath")),
    ("findinstall", ("dispatch", "intf", "id", "instPath")),
    ("installtype", ("dispatch", "id", "method", "intf")),
    ("zfcpconfig", ("id.zfcp", "id.diskset", "intf")),
    ("indexmark1", doNothing, ()),
    ("partitionmethod", ("id.partitions", "id.instClass")),
    ("partitionobjinit", partitionObjectsInitialize, ("id.diskset",
                                                      "id.partitions",
                                                      "dir", "intf")),
    ("partitionmethodsetup", partitionMethodSetup, ("id.partitions",
                                                    "dispatch")),
    ("autopartition", ("id.diskset", "id.partitions", "intf", "dispatch")),
    ("autopartitionexecute", doAutoPartition, ("dir", "id.diskset",
                                               "id.partitions", "intf",
                                               "id.instClass", "dispatch")),
    ("fdisk", ("id.diskset", "id.partitions", "intf")),
    ("fdasd", ("id.diskset", "id.partitions", "intf")),
    ("partition", ("id.fsset", "id.diskset", "id.partitions", "intf")),
    ("upgrademount", upgradeMountFilesystems, ("intf", "id.upgradeRoot",
                                               "id.fsset", "instPath")),
    ("upgradecontinue", queryUpgradeContinue, ("intf", "dir")),
    ("upgradeswapsuggestion", upgradeSwapSuggestion, ("dispatch", "id",
                                                      "instPath")),
    ("addswap", ("intf", "id.fsset", "instPath",
                 "id.upgradeSwapInfo", "dispatch")),
    ("partitiondone", partitioningComplete, ("id.bootloader", "id.fsset",
                                             "id.diskset", "id.partitions",
                                             "intf", "instPath", "dir")),
    ("upgrademigfind", upgradeMigrateFind, ("dispatch", "id.fsset")),
    ("upgrademigratefs",  ("id.fsset",)),
    ("upgbootloader", ("dispatch", "id.bootloader")),
    ("bootloadersetup", bootloaderSetupChoices, ("dispatch", "id.bootloader",
                                                 "id.fsset", "id.diskset",
                                                 "dir")),
    ("bootloader", ("dispatch", "id.bootloader", "id.fsset", "id.diskset")),
    ("bootloaderadvanced", ("dispatch", "id.bootloader", "id.fsset",
                            "id.diskset")),
    ("networkdevicecheck", networkDeviceCheck, ("id.network", "dispatch")),
    ("network", ("id.network", "dir", "intf", "id")),
    ("firewall", ("intf", "id.network", "id.firewall", "id.security")),
    ("timezone", ("id.instLanguage", "id.timezone")),
    ("accounts", ("intf", "id.rootPassword")),
    ("authentication", ("id.auth",)),
    ("readcomps", readPackages, ("intf", "method", "id")),
    ("desktopchoice", ("intf", "id.instClass", "dispatch", "id.grpset")),
    ("findpackages", upgradeFindPackages, ("intf", "method", "id",
                                           "instPath", "dir")),
    ("selectlangpackages", selectLanguageSupportGroups, ("id.grpset","id.instLanguage")),   
    ("package-selection", ("id.grpset", "id.instLanguage", "id.instClass", "dispatch")),
    ("indivpackage", ("id.grpset",)),
    ("handleX11pkgs", handleX11Packages, ("dir", "intf", "dispatch",
                                          "id", "instPath")),
    ("handlemiscpkgs", handleMiscPackages, ("intf", "id", "dir")),
    ("fixupconditionals", fixupConditionals, ("id.grpset",)),
    ("checkdeps", checkDependencies, ("dir", "intf", "dispatch",
                                      "id", "instPath")),
    ("dependencies", ("id.grpset", "id.dependencies")),
    ("confirminstall", ("intf", "id",)),
    ("confirmupgrade", ("intf", "id",)),
    ("indexmark2", doNothing, ()),
    ("install", ("dir", "intf", "id")),
    ("enablefilesystems", turnOnFilesystems, ("dir", "id.fsset",
                                              "id.diskset", "id.partitions",
                                              "id.upgrade", "instPath")),
    ("migratefilesystems", doMigrateFilesystems, ("dir", "id.fsset",
                                              "id.diskset", "id.upgrade",
                                              "instPath")),
    ("setuptime", setupTimezone, ("id.timezone", "id.upgrade", "instPath",
                                  "dir")),
    ("preinstallconfig", doPreInstall, ("method", "id", "intf", "instPath",
                                        "dir")),
    ("installpackages", doInstall, ("method", "id", "intf", "instPath")),
    ("postinstallconfig", doPostInstall, ("method", "id", "intf", "instPath")),
    ("writeconfig", writeConfiguration, ("id", "instPath")),
    ("firstboot", firstbootConfiguration, ("id", "instPath")),
    ("instbootloader", writeBootloader, ("intf", "instPath", "id.fsset",
                                         "id.bootloader", "id.instLanguage",
                                         "id.grpset")),
    ("bootdisk", ("dir", "dispatch", "id.fsset")),
    ("makebootdisk", makeBootdisk, ("intf", "dir", "id.floppyDevice",
                                    "id.grpset", "instPath", "id.bootloader")),
#
# we dont use videocard and xcustom currently, they are still listed as
# steps but are not listed in the list of install steps in installclass.py
#   
    ("videocard", ("dispatch", "id.xsetup", "id.videocard", "intf")),
#   
# this got moved up to just after mouse config, only runs if monitor probe
# failed. Needs to be here if we enable videocard and xcustom again.
#    ("monitor", ("id.xsetup", "id.monitor", "intf")),
    ("xcustom", ("id.xsetup", "id.monitor", "id.videocard",
                 "id.desktop", "id.grpset", "id.instClass", "instPath")),
    ("writexconfig", writeXConfiguration, ("id", "instPath")),
    ("writeksconfig", writeKSConfiguration, ("id", "instPath")),
    ("setfilecon", setFileCons, ("instPath","id.partitions")),
    ("copylogs", copyAnacondaLogs, ("instPath",)),
    ("dopostaction", doPostAction, ("id", "instPath", "intf")),
    ("methodcomplete", doMethodComplete, ("method", "id.fsset")),
    ("dopostpost",doPostpost, ("method","id")),
    ("complete", ("intf", "id", "dispatch"))
    ]
同样在dispatch.py中实现了如下的方法:
def currentStep(self):
    if self.step == None:
        self.gotoNext()
    elif self.step >= len(installSteps):
        return (None, None)
    stepInfo = installSteps[self.step]
    step = stepInfo[0]
    args = self.bindArgs(stepInfo[1])
    return (step, args)
也就是说,当调用此方法时,它的返回返回值就是序列中的第一项,和一个元组。
来看gui.py中的一个调用此方法的方法:
def setScreen (self):
    (step, args) = self.dispatch.currentStep()  //这就是调用的所要求的返回值
    if step is None:      
        gtk.main_quit()          //如果序列中不存在此项,则直接崩溃。
        return
   
        if self.dir == 1:
        return self.nextClicked()
        else:
        return self.prevClicked()
        
    (file, className) = stepToClass[step]        //这是对字典的操作,即去查询序列的第一项里是否是字典的key值。
        newScreenClass = None
    s = "from %s import %s; newScreenClass = %s" % (file, className,
                                                        className)
        #print s
        while 1:
            try:
                exec s
                break
            except ImportError, e:
                print e
                win = MessageWindow(_("Error!"),
                                   _("An error occurred when attempting "
                                     "to load an installer interface "
                                     "component.\n\nclassName = %s") % (className,),
                                    type="custom", custom_icon="warning",
                                    custom_buttons=[_("_Exit"),
                                                    _("_Retry")])  //如果不存在,则会报这么一个错误。
                if not win.getrc():
                    if flags.rootpath:
                        msg =  _("The installer will now exit...")
                        buttons = [_("_Exit")]
                    else:
                        msg =  _("Your system will now be rebooted...")
                        buttons = [_("_Reboot")]
                    MessageWindow(_("Rebooting System"),
                                  msg,
                                  type="custom",
                                  custom_icon="warning",
                                  custom_buttons=buttons)
                    sys.exit(0)
这个字典一直运行在anaconda的生命周期中。应当去注意它的无处不在。