通过另一种方法退出lambda表达式

时间:2019-01-09 16:19:36

标签: python-3.x lambda

我有一个程序,通过单击一个按钮来启动数据类型转换。我在按钮命令中使用了lambda函数。在转换开始之前,方法会检查是否已选择输入。现在,如果没有选择输入文件,我会在jupyter笔记本电脑中收到一条错误消息,这不一定是问题,因为无论如何都不应该开始数据类型转换。但是我问自己是否有办法阻止lambda函数的继续。我将添加一段代码,并进一步解释我的意思:

我的按钮命令:

self.program_start["command"]=lambda:[self.fileselectwarning(),self.writealldatafile(),self.writeselecteddata(),
                                         self.inputliste.clear(),self.fileopeningcounter.set(0),
                                         self.inputfilenamelist.clear()]

检查是否已选择输入/输出文件的方法:

def fileselectwarning(self):
    stringliste=[self.fileopenname.get(),self.filesavename.get()]
    if stringliste[0]=="" and not stringliste[1]=="":
        self.messagebox1 = messagebox.showwarning("Missing Inputfile","No Inputfile selected, please select one and retry!")
    elif not stringliste[0]=="" and stringliste[1]=="":
        self.messagebox2 = messagebox.showwarning("Missing Outputfile","No Outputfilename selected, please select one and retry!")
    elif stringliste[0]=="" and stringliste[1]=="":
        self.messagebox3 = messagebox.showwarning("Missing Files","Neither Input nor Outputfile were selected, please select both and retry!")
    elif not stringliste[0]=="" and not stringliste[1]=="":
        ausfuehrenderdatenverarbeitung=self.zugriffaufdatenverarb()

因此,在我的方法fileselectwarning中,当同时选择了输入文件和输出文件时,将调用另一个方法,该方法将开始部分转换。然后调用按钮的lambda函数中的所有其他方法,这取决于通过“ fileselectwarning”方法调用的方法中创建的列表。但是,如果缺少输入或输出文件,则lambda函数会继续并且尚未创建这些列表,因此会产生错误。

要对此进行汇总,有没有办法阻止lambda函数继续 并在“ fileselectwarning”方法中实现它?

1 个答案:

答案 0 :(得分:2)

编写常规函数,而不是在lambda表达式中滥用列表构造函数来调用函数。

为了中止执行,您可以使用由fileselectwarning引发的自定义异常。该功能本身也可以简化。

class MissingFiles(Exception):
    pass

class ...:
    def fileselectwarning(self):
        infile, outfile = self.fileopenname.get(), self.filesavename.get()
        if not infile and outfile:
            raise MissingFiles("No Inputfile selected, please select one and retry!")
        elif infile and not outfile:
            raise MissingFiles("No Outputfilename selected, please select one and retry!")
        elif not infile and not outfile:
            raise MissingFiles("Neither Input nor Outputfile were selected, please select both and retry!")
        else:
            ausfuehrenderdatenverarbeitung=self.zugriffaufdatenverarb()

    def start_command(self):
        try:
            self.fileselectwarning()
        except MissingFiles as e:
            self.messagebox1 = messagebox.showwarning("Missing files", str(e))
            return
        self.writealldatafile()
        self.writeselecteddata()
        self.inputliste.clear()
        self.fileopeningcounter.set(0)
        self.inputfilenamelist.clear()

然后在分配命令时,请执行以下操作:

    self.program_start["command"] = self.start_command

很明显,我无法对其进行测试,因此它可能不会立即起作用,但它显示了总体思路。