导入、类和匹配之间的交互..Python中的case



我对Python中的from ... import ...、类构造函数和match...case如何相互作用感到困惑。

假设有两个模块,foobarfoobar导入CONST,并尝试在match...case构造中的Foo__init__()中使用它。由此得到CCD_ 11。

下面是最小的复制器。

foo.py:

from bar import CONST
class Foo:
def __init__(self, var):
print(CONST)
match var:
case CONST:
print("hit")
foo_instance = Foo(1)

bar.py(仅单线(:

CONST = 1

错误为:

Traceback (most recent call last):
File "…/foo.py", line 10, in <module>
foo_instance = Foo(1)
File "…/foo.py", line 5, in __init__
print(CONST)
UnboundLocalError: local variable 'CONST' referenced before assignment

如果我从__init()__中删除match...case,或者用一个简单的if替换它,错误就会消失,print(CONST)会按照我的预期打印1

pylint还警告代码:

foo.py:7:17: W0621: Redefining name 'CONST' from outer scope (line 1) (redefined-outer-name)
foo.py:5:14: E0601: Using variable 'CONST' before assignment (used-before-assignment)
foo.py:7:17: C0103: Variable name "CONST" doesn't conform to snake_case naming style (invalid-name)

但我真的不明白。这里的范围界定有什么问题?

你能向我解释一下这种行为吗?

使用中的Python解释器版本:3.10.7

谢谢。

在这种情况下,case CONST的作用类似于赋值。这是因为case语句也可以用于捕获匹配的值。因此,python试图在该范围内创建一个名为CONST的新变量。因此,前面的print(CONST)的行为就像它试图访问一个在执行匹配之前不存在的变量。

参考编号:https://docs.python.org/3/tutorial/controlflow.html#match-报表

模式看起来像是拆包分配,可以用于绑定变量:

# point is an (x, y) tuple
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")

相关内容

  • 没有找到相关文章

最新更新