首页 > 解决方案 > 当我尝试使用参数测试我的代码时,我正在努力从我的函数中删除此错误

问题描述

当我尝试使用“我遇到的错误”列表中列出的参数测试我的代码时,我正在努力从我的函数中删除此错误

有人可以帮助我我一直在尝试修复此错误但无法解决吗?

我在下面列出:

  1. 我们必须为此代码处理的 number.txt 文件

  2. 我得到的错误

  3. 我的代码

  4. 样品测试

所以我的问题很清楚。

在这个问题中使用customers.txt 文件。

12345,Tom,Black,300.00,1998-01-30
23456,Alice,Smith,1200.50,1998-02-20
14567,Jane,White,900.00,1998-07-01
43564,Weilin,Zhao,450.25,1998-01-03
45432,Bina,Mehta,278.95,1998-03-21

我得到的错误

Test various parameters: '['customers file variable', '12345']'
ERROR:
Expected: ['12345', 'Tom', 'Black', '300.00', '1998-01-30']
Test various parameters: '['customers file variable', '45432']'
ERROR:
Expected: ['45432', 'Bina', 'Mehta', '278.95', '1998-03-21']
def customer_by_id(fh, id_number):
    """
    -------------------------------------------------------
    Find the record for a given ID in a sequential file.
    Use: result = customer_by_id(fh, id_number)
    -------------------------------------------------------
    Parameters:
        fh - file to search (file handle - already open for reading)
        id_number - the id_number to match (str)
    Returns:
        result - the record with id_number if it exists,
            an empty list otherwise (list)
    -------------------------------------------------------
    """
    num = fh.read().split("\id_number")
    if int(id_number) < len(num):
        result = int(num[id_number]).strip().split(",")
    else:
        result = []
    print(result)

样品测试:

Find customer by id_number
Enter an ID: 23456
['23456', 'Alice', 'Smith', '1200.50', '1998-02-20']
----
Find customer by id_number
Enter an ID: 99999
[]

标签: python

解决方案


首先,在您的代码中,.split("\id_number")导致了问题。它在文本文件中查找不存在的字符串。 \id_number因此,这会产生一个包含单个元素的列表,后者是整个文本。

然后该if条款没有意义,直言不讳。左侧是例如12345表示客户id的整数。另一方面,右侧是列表的元素数,即 1。语法正确,但语义错误。

所以当你看到这个时,LHS 几乎总是一个很大的数字,比如 12345,而 RHS 是 1。if因此,这个子句永远不会被执行。相反,else达到了部分,导致一个空列表。

这是我不使用 csv 的建议。

def customer_by_id(fh, id_number):
    records = f.read().splitlines()
    records = [record.split(",") for record in records]
    for record in records:
        if record[0] == id_number:
            return record
    return []

with open("customers.txt", "r") as f:
    print(customer_by_id(f, "23456"))

在函数定义的第一行,records是一个包含每行customers.txt 的列表。所以它看起来像

['23456,Alice,Smith,1200.50,1998-02-20', '14567,Jane,White,900.00,1998-07-01', ...]

请注意,列表的每个元素只是一个字符串。

第二行现在使用 . 将每个字符串转换为列表split()。现在records是一个列表的列表,即 的每个元素records又是一个列表。现在看起来像

[['23456', 'Alice', 'Smith', '1200.50', '1998-02-20'], ['14567', 'Jane', 'White', '900.00', '1998-07-01'], ... ]

接下来,for 循环遍历这些子列表并将(子列表的)第一个元素与id_number. 如果它们匹配,则返回子列表(结束函数)。否则,继续迭代。当它们都不匹配id_number,return []时。


推荐阅读