【问题标题】:Python program continuing to run after encountering an errorPython程序遇到错误后继续运行
【发布时间】:2015-12-25 06:17:59
【问题描述】:

我正在为我的线性代数类创建一个包含向量和矩阵类的程序,但我无法将我的矩阵类字符串化以打印它。导致问题的原因是一个 if 语句,如果它不是一行中的最后一个条目,它会在矩阵中的条目之后添加一个逗号。对此感到好奇的是,我已将问题隔离到我的程序部分,该部分将变量分配给手头条目的索引,但是当我在之后添加一行时打印该变量以尝试找出发生了什么,运行程序打印变量,然后从之前的行给出错误。代码如下:

import copy
class vector:

    def __init__(self, entries):
        if type(entries) == list:

            self.elements = []
            self.dimensionality = len(entries)
            for entry in entries:
                self.elements.append(entry)
        if type(entries) == vector:
            self.elements = entries.elements

    def __str__(self):
        buff = "("
        for e in self.elements:
            buff += str(e)
            if self.elements.index(e) < len(self.elements) - 1:
                buff += ", "
        buff += ")"
        return buff
    def __getitem__(self,index):
        return self.elements[index]

    def __len__(self):
        return len(self.elements)

    def __mul__(self, otherVector):
        if self.dimensionality != otherVector.dimensionality:
            raise RuntimeError("Cannot multiply vectors of different dimensions")
        else:
            product = 0
            for e in self.elements:
                product += e * otherVector.elements[self.elements.index(e)]
            return product

    def __eq__(self, otherVariable):
        return size(self) == size(otherVariable)

    def size(x):
        return (x * x)**(1/2)



class matrix:
    def __init__(self, entries):
        for i in entries:
            if len(entries[0]) != len(i):
                raise RuntimeError("All rows of matrix must contain the same number of entries")
        self.elements = []
        for row in entries:
            self.elements.append(vector(row))
    def __str__(self):
        buff = "("
        for row in self.elements:
            buff += str(row)
            a = self.elements.index(row)   #this is the line that prompts the error
            b = len(self.elements) - 1
            print (a)                     #but this line executes before the error cuts off the rest of the program
            print(b)
            print(a<b)
            if a < b :
                buff += ", "
        buff += ")"
        return buff

print(matrix([[1,2],[2,3]]))

这是它给我的错误:

Traceback (most recent call last):
  File "/Users/sebpole/Documents/vectors.py", line 127, in <module>
    print(matrix([[1,2],[2,3]]))
  File "/Users/sebpole/Documents/vectors.py", line 83, in __str__
    a = self.elements.index(row)
  File "/Users/sebpole/Documents/vectors.py", line 38, in __eq__
    return size(self) == size(otherVariable)
NameError: name 'size' is not defined

我通过跳过函数“size()”的定义并将其写入向量相等的定义来修复该特定错误。由于它很短,这不是问题,并且在调整后程序运行良好,但我有以下两个概念性问题: 1)在错误执行之前执行错误之后的行是怎么回事? 2)究竟是什么问题?为什么程序在调用我稍后定义的函数时出现问题?为什么取矩阵的一行的索引称为该行(向量)的相等定义?

【问题讨论】:

    标签: class python-3.x linear-algebra theory


    【解决方案1】:

    使用self.save 引用您的类中定义的函数

    【讨论】:

    • 你能告诉我具体的方法吗?我在哪里插入?
    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    【解决方案2】:

    错误来自于第 127 行中对 print 的调用,并且整行都没有被执行。除了堆栈跟踪之外,您真的在控制台中看到了打印输出吗?

    从概念上讲,有问题的行 print(matrix([[1,2],[2,3]])) 是这样做的:

    • matrix 实例创建成功
    • print 在该 matrix 实例上调用 __str__
    • __str__vector 实例列表中调用index
    • index 需要在列表中查找匹配值,并在列表的每个成员上调用 __eq__ 以查找匹配项
    • 您的原始 __eq__ 代码调用了一个名为 size 的缺失函数(您注意到并已修复)

    我很惊讶这会产生除错误之外的任何输出。

    【讨论】:

    • '0 1 True Traceback(最近一次调用最后一次):文件“/Users/sebpole/Documents/vectors.py”,第 163 行,在 print(matrix([[1,2 ],[2,3]])) 文件“/Users/sebpole/Documents/vectors.py”,第 100 行,在 str a = self.elements.index(row) 文件“/Users /sebpole/Documents/vectors.py",第 47 行,在 eq 中 return size(self) == size(otherVariable) NameError: name 'size' is not defined' 是我跑时所做的它,如您所见,在错误之后运行该行...
    • 您的示例中只有 1 行程序代码 (print(matrix([[1,2],[2,3]])))。我看到的是那条线产生了错误。您看到错误后的哪一行?
    • 是的,但是该行正在调用函数并且函数中发生错误。我指的是函数中发生的事情。
    • 我建议使用pdb 来检查正在发生的事情。您可以使用此行设置断点import pdb; pdb.set_trace()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2021-07-03
    • 2022-11-25
    • 2017-10-11
    • 2014-07-01
    • 2020-10-28
    相关资源
    最近更新 更多