gpt4 book ai didi

python - 在上下文管理器 (with) 和异常处理程序中分配给具有 `as` 的成员

转载 作者:行者123 更新时间:2023-11-28 16:57:20 24 4
gpt4 key购买 nike

首先,如果我没有为事物使用正确的名称,我想道歉,我是 Python 的新手。

在玩游戏时,我发现您可以在 with 语句的 as 部分中分配给类成员:

from contextlib import contextmanager

@contextmanager
def func(val):
yield val*2

class Foo:
def __init__(self):
self.val = "Placeholder"

def bar(self):
with func(333) as self.val:
print("Got", self.val)


if __name__ == "__main__":
f = Foo()
print("Before:", f.val)
f.bar()
print("After:", f.val)

输出:

Before: Placeholder
Got 666
After: 666

但是,分配给 except 中的成员会出现语法错误:

class Foo:
def __init__(self):
self.err = None

def bar(self):
try:
os.remove(path)
except FileNotFoundError as self.err:
print("Couldn't remove", path)

输出:

except FileNotFoundError as self.err:                                      
^

SyntaxError: invalid syntax

由于搜索 as 是徒劳的,我无法找到任何相关引用,我的问题是:

  1. 分配给 with 语句的 as 部分中的成员是否定义明确?
  2. 如果可以,为什么在异常处理中不允许?

编辑:我想关于import...

可以问一个类似的问题

最佳答案

except clause 中, as 只能赋值给一个标识符。在 with clause , as 可以分配给任意目标。

try1_stmt ::=  "try" ":" suite
("except" [expression ["as" identifier]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]

with_item ::= expression ["as" target]

A target是标识符 (foo)、属性 (foo.bar)、切片 (foo[:bar])、订阅 (foo[bar]),上面的列表/元组 (foo, bar) 或上面的 splat (*foo)。


异常在它们的异常处理程序之后被自动清除。在处理程序之后使用名称表明它已被删除:

>>> a = 1
>>> try:
... 1/0
... except ZeroDivisionError as a:
... pass
... print(a)
NameError: name 'a' is not defined

这避免了异常、抛出异常的帧和绑定(bind)异常的名称之间不必要的引用循环。

直接绑定(bind)到另一个命名空间需要选择以下两种情况之一:

  • 属性在处理程序之后被删除。这意味着对象的外观不一致。
  • 属性在处理程序之后没有被删除。这意味着除非手动清除,否则框架将无限期存在。

这两种变体都需要在处理程序之外显式处理异常。此外,它们很容易意外触发需要在其他地方进行显式处理的情况。

关于python - 在上下文管理器 (with) 和异常处理程序中分配给具有 `as` 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com