【问题标题】:Issues while parsing the typing List in python解析python中的打字列表时出现问题
【发布时间】:2020-06-24 19:10:02
【问题描述】:

我在调试这个场景时遇到了一些问题。

我想要的是,我想将 return_value 的所有内容复制到 MainInfo 类中,并将其作为字符串返回。

执行此操作时,我收到错误

    for (name, data1, data2, data3, data4, data5) in range(12):
TypeError: cannot unpack non-iterable int object

我将在这里复制整个代码字节。

class DataEntry(object):

name: str = ''
data1: int = 0
data2: int = 0
data3: int = 0
data4: int = 0
data5: int = 0

def __init__(self,
             name: str,
             data1: int,
             data2: int,
             data3: int,
             data4:int,
             data5: int) -> None:
    super().__init__()
    self.name = name
    self.data1 = data1
    self.data2 = data2
    self.data3 = data3
    self.data4 = data4
    self.data5 = data5

def __str__(self) -> str:
    output_string = f'name: {self.name}\n'
    output_string += f'data1: {self.data1}\n'
    output_string += f'data2: {self.data2}\n'
    output_string += f'data3: {self.data3}\n'
    output_string += f'data4: {self.data4}\n'
    output_string += f'data5: {self.data5}\n'
    return output_string


class DataInfo(object):

    data_entries: List[DataEntry] = []

    def __init__(self, data_entries: List[DataEntry] = None) -> None:
        if data_entries is None:
            data_entries = []
        self.data_entries = data_entries

    def __str__(self) -> str:
        output_string = 'DataInfo:\n'
        output_string += '-'*80
        for entry in self.data_entries:
            output_string += entry
            output_string += '-'*80
        return output_string

class MainInfo(object):

    data_info: DataInfo = None

    def __init__(self,data_info: DataInfo) -> None:
        self.data_info = data_info

    def __str__(self) -> str:
        output_string = self.data_info
        return output_string

def in_a_fun() -> MainInfo:

    return_value= fun()
    print("**** return_values - ",return_value)
    print("**** return_values - ",return_value[0][0][0])
    print("**** return_values - ",return_value[0][0][1])
    print("**** return_values - ",return_value[0][0][2])
    print("**** return_values - ",return_value[0][0][3])
    print("**** return_values - ",return_value[0][0][4])
    print("**** return_values - ",return_value[0][0][5])
    print("**** return_values - ",return_value[0][1][0])
    data_info = DataInfo()
    for (name, data1, data2, data3, data4, data5) in range(12):
        data_entry = DataEntry(name, data1, data2, data3,data4 ,data5)
    data_info.data_entries.append(data_entry)
    return MainInfo{
        data_info=data_info)

这些打印的控制台输出是

**** return_values - [[('ABCD', 1234, 5678, 1, 1, 1), ('EFGH', 9012, 1314, 1718, 0, 10)]]
**** return_values -   ABCD
**** return_values -   1234
**** return_values -   5678
**** return_values -   1
**** return_values -   1
**** return_values -   1
**** return_values -   EFGH

这里我只粘贴两个列表。但实际上它可能是 12。这就是为什么我在 for-loop 中提到它为 range(12)

【问题讨论】:

  • 用您自己的话来说,您认为range(12) 是什么意思,您认为for (name, data1, data2, data3, data4, data5) in range(12): 是什么意思?例如,您认为 name 的值应该是第一次通过循环 - 为什么?您希望它如何获得该值?

标签: python list typing


【解决方案1】:

您的错误来自于尝试解压缩 range(12) 返回的第一个 int。你真正想做的是:

for i in range(12):
    # Unpack the data you want for the ith DataEntry
    name, data1, data2, ... = return_value[0][i][0], return_value[0][i][1], return_value[0][i][2], ... 

    # Same as before
    data_entry = DataEntry(name, data1, data2, data3,data4 ,data5)
    data_info.data_entries.append(data_entry)

【讨论】:

  • 感谢您的方法。但是在你的回答中,你只使用一个循环语句来解压它。我认为在我们的例子中,我们需要有 2 个嵌套的 for 循环。我说的对吗?
  • @VishnuCS 你能详细说明return_value 中的条目吗?我的解决方案从return_value 的第 i 个列表中解压缩它的值后创建 12 个 DataEntry 对象。我没有完全完成拆包线,但你应该能够明白。您不需要循环来解压缩值
  • return_values - [[('ABCD', 1234, 5678, 1, 1, 1), ('EFGH', 9012, 1314, 1718, 0, 10)]]。截至目前,您可以在return_value 中看到 2 个单独的列表。实际用例在这个return_value中会有12个单独的列表
  • 我对此做了一些修改,它奏效了。感谢您的信息。
【解决方案2】:

当您在 item 语法中使用 for (name, data1, etc) 时,Python 期望 item 是 iterables 的可迭代,可以将其解包为变量 name、data1 等。在这种情况下,当您迭代在 item 上,item 的单个成员是 int,不能解包。

如果要拆包,需要替换range(12)。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多