我对Python中的from ... import ...
、类构造函数和match...case
如何相互作用感到困惑。
假设有两个模块,foo
和bar
。foo
从bar
导入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")