为什么我的 Python class 中设置方法的 NameError 不起作用?

Why is the NameError from the set method in my Python class not working?

好吧,这个模块是关于创建“矩阵”的。无论哪个维度,值都以0开始填充。我有一个名为set的函数,它将矩阵的一个位置交换为特定数字。

示例:

A = Matrix(3,3) 

print(A)
0 0 0 
0 0 0
0 0 0 
A.set(1,2,3)

print(A)
0 0 0
0 0 3
0 0 0

我需要设置为只接受数字或浮点数,不接受字符串,所以我提出了一个 NameError,但它没有捕捉到。似乎为了让我的代码工作并显示 NameError,我需要用“”编写,因为如果没有,它告诉我没有定义。

我需要这些:

示例:

A.set(1,2,l) 

returns “Not a number or a float”

但是我却得到了这个

A.set(1,2,l)

returns “NameError: l is not defined”

我可以从我的代码中修复什么以便捕获我的 NameError?

这是我的代码:

class Matrix():
    
    def __init__(self,width,height):
        fill_value = 0
        self.height = height #columna
        self. width = width #fila
        self.rows = [[fill_value] * width for _ in range (height)]
        self.m = self.rows 
        
    def __str__(self):
        return "\n".join(" ".join(map(str, self.m))for self.m in self.m)
      
    def get(self, row_index, column_index):
        try:
            return self.m[row_index][column_index]
        except NameError:
            return "Its not a number"
        except IndexError:
            return "Not in matrix range" 

    def set(self, row_index,column_index,value):
        self.m[row_index][column_index] = value      

钯。我正在尝试使用 get 函数(在本例中仅使用 int),但它也不起作用。

困惑在于 Python 如何解释您在参数中传递给函数的值。

当你这样调用函数时:

A.set(1,2,l) 

您传递了 3 个参数:

  • 1,一个整数
  • 2,一个整数
  • 字母l,解析为变量名

Python 然后检查它的各种内存空间(locals,等等)寻找变量 l,但找不到它。因此,它甚至无法调用您的函数并立即 returns 一个 NameError,因为您的 set 方法的参数之一有错误。

如果你想让你的参数接受字母,那么它们必须是字符串类型,当字符被单引号或双引号括起来时,Python 将解析它:

A.set(1, 2, 'l')

这会将具有一个字符 'l' 的字符串添加到位置 (1, 2)。

请注意,使用您当前的代码不会在此处生成错误,因为在您的设置方法中您没有 try/catch 块并且不检查任何类型。如果你想阻止用户输入一个字符串作为值,你需要做一些验证它是正确的 class,像这样:

def set(self, row_index,column_index,value):
    if not isinstance(value, (int, float)):
        raise NameError(f"value (arg 3) must be an int or float, was a {type(value)}")
    else:
        self.m[row_index][column_index] = value

然后我认为如果行或列输入不是整数或超出范围(与您相同在 get 方法中做了。