使用 pickle 时无法重载 python 对象

Can't overload python object while using pickle

通过输入命令获取输入并从主文件调用对象。

rafTur = input(' : ')
rafKat = input(' : ')
rafNo = input( : ')
rafIndex = input(' : ')
req.search_record(' : ')
req.search_record(rafTur, rafKat, rafNo, rafIndex)

req.py :

def search_record( rafTur, rafKat, rafNo, rafIndex= None):
   infile = open('noSqlDB', 'rb')
   flag = False

   while True:
       try:
           reading the oject from file

        sistem = pickle.load(infile)
        if sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and rafIndex==None: # This is where the error happens
            print("Raf No : ",sistem['rafIndex'],"Raf data : ",sistem['rafIndexData'])
            print(":", rafIndex)
            flag = True
            break
        # display record if found and set flag
        if (sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):
            print(sistem['rafIndexData'],"\n")
            flag = True
            break

    except EOFError:
        print("deb")
        break

   if flag == False:
       print('Record not Found')
       print()


   infile.close()

我正在尝试重载 search_record() 函数。当我将 = None 放入 rafIndex 变量时,程序以 OFError 退出并打印 deb (仅用于调试)。如果没有 = None 命令,代码在没有 = None 命令的情况下也能正常工作。

我尝试将带有 == None 的 if 语句更改为 == '' 它也不起作用。我还尝试通过 rafIndex = None 手动将 rafIndex 分配给 None 但它也不起作用。

在 Clion 中使用 python 3.9 virtualenv

我认为您的问题出在您尝试加载已腌制对象的前一行。 如果您可以在此处粘贴堆栈跟踪而不是捕获异常,那将非常有帮助。如果在执行 pickle.load

之后打印 'sistem' 对象,对于调试也会有帮助

所以主要问题是变量和输入的类型不同。所以将它们转换为 int 和 string 将解决问题。

创建了一个转换函数:

def toCast(rafTur, rafKat, rafNo, rafIndex):
    if rafTur != "":
        rafTur = str(rafTur) #Change this

    if rafKat != "":
        rafKat = int(rafKat)

    if rafNo != "":
        rafNo = int(rafNo)

    if rafIndex != "":
        rafIndex = int(rafIndex)


    return  rafTur,rafKat,rafNo,rafIndex

如果函数不为空,则该函数进行转换,之后我在 main 中使用了这个函数,如下所示:

elif choice == '3':

            rafTur = input('Rafın türünü giriniz : ')
            rafKat = input('Rafın katını giriniz : ')
            rafNo = input('Rafın Nosunu giriniz : ')
            rafIndex = input('Rafın indexini giriniz : ') 
            rafTur,rafKat,rafNo,rafIndex = req.toCast(rafTur, rafKat, rafNo, rafIndex)

            req.search_record(rafTur, rafKat, rafNo, rafIndex)

之后,我将 search_record(rafTur, rafKat, rafNo, rafIndex) 中的 if else 更改为:

 def search_record(rafTur, rafKat, rafNo, rafIndex):
    infile = open('noSqlDB', 'rb')
    sistem = pickle.load(infile)
    flag = False

    # read to the end of file.
    for x in range((len(sistem)+1)):
        try:

            if (sistem['rafTur'].upper() == rafTur.upper() and rafKat == "" and rafNo == ""
                    and rafIndex == ""):

                print(sistem['rafTur'],sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
                flag = True


            elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and
                    rafNo == "" and rafIndex == ""):

                print(sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
                flag = True

            elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
                'rafNo'] == rafNo and rafIndex == ""):

                print(sistem['rafIndex'], sistem['rafIndexData'])
                flag = True

            elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
                'rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):

                print(sistem['rafIndexData'])
                flag = True

            sistem = pickle.load(infile)
        except EOFError:
            break

    if flag == False:
        print('Record not Found')
        print()

    # close the file
    infile.close()