如何使此代码更紧凑,更易于实现?

时间:2019-11-29 20:53:25

标签: python-3.x

这是一种基于用户提供的数据在csvfile中搜索书籍的方法。如果他们没有为某些输入(例如体裁)提供任何数据,则将使用所有体裁的书籍。例如,如果我输入:作者:-,书名:-,体裁:科幻,那么给出所有科幻书籍,无论作者或书名如何。

def filltreeview(self , authorvar , booknamevar , genrevar):
    author = authorvar.get()
    bookname = booknamevar.get()
    genre = genrevar.get()
    books = []

    if genre == 'Genre':
        if author == '':
            if bookname == '':
                msg.showerror('Error' , 'Please specify some details')
            else:
                with open('Books.txt' , 'r') as csvfile:
                    reader = csv.reader(csvfile)
                    for row in reader:
                        if row == []:
                            pass
                        elif row[2] == bookname:
                            books.append([row[0],row[1],row[2],row[3]])


        else:
            with open('Books.txt' , 'r') as csvfile:
                reader = csv.reader(csvfile)    
                for row in reader:
                    if row == []:
                        pass
                    elif row[1] == author:
                        books.append([row[0],row[1],row[2],row[3]])
                print(books)
                if bookname == '':
                    pass
                else:
                    for i in books:
                        if i[2] != bookname:
                            books.remove(i)


    else:
        with open('Books.txt' , 'r') as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                if row == []:
                    pass
                elif row[3] == genre:
                    books.append([row[0],row[1],row[2],row[3]])
                    print(books)

                    if author == '':
                        if bookname == '':
                            pass
                    else:
                        for i in books:
                            if i[1] != author:
                                books.remove(i)
                                print(books)

                    if bookname == '':
                        pass
                    else:
                        for i in books:
                            if i[2] != bookname:
                                books.remove(i)
                                print(books)

2 个答案:

答案 0 :(得分:1)

如何?

def get_all_books(reader_path):
    books = []
    with open(reader_path , 'r') as csvfile:
        reader = csv.reader(csvfile)
    for row in reader:
        if row:
            books.append(row[:4])
    return books

def remove_books(books, row_num, value):
    for book in books:
        if book[row_num] is not value:
            books.remove(book)
    return books

def filltreeview(self , authorvar , booknamevar , genrevar):
    author, bookname, genre = authorvar.get(), booknamevar.get(), genrevar.get()
    if genre == 'Genre' and not author and not bookname:
        msg.showerror('Error' , 'Please specify some details')
        # a return here will avoid adding the rest of the code under 'else'
    else:
        books = get_all_books('Books.txt')
        if genre:
            books = remove_books(books, 3, genre)
        if author:
            books = remove_books(books, 1, author)
        if bookname:
            books = remove_books(books, 2, bookname)
        print(books)

答案 1 :(得分:0)

函数可能在这里为您提供帮助,例如这段代码:

                reader = csv.reader(csvfile)
                for row in reader:
                    if row == []:
                        pass
                    elif row[i] == bookname:
                        books.append([row[x],row[y],row[z],row[w]])

似乎要多次写入,因此您可以将其提取到单独的函数中,然后再使用它。请记住,函数只能做一件事,因此可以在不同的场景和用例中重复使用。

此外,您还应该关注singledispatch。尝试完成某件事时应使用此功能,但是根据参数类型的不同,它会有所不同。