鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 4

[已解决]第34讲最后一道测试题

[复制链接]
发表于 2019-10-13 20:14:41 | 显示全部楼层 |阅读模式
20鱼币
代码如下:
with A() as a:
    with B() as b:
        suite
问题:
A()是什么东西?suite了?
整个代码是什么意思?
如果有with语句的相关介绍就更好了
最佳答案
2019-10-13 20:14:42
8.5. with 语句
with 语句用于包装带有使用上下文管理器 (参见 with 语句上下文管理器 一节) 定义的方法的代码块的执行。 这允许对普通的 try...except...finally 使用模式进行封装以方便地重用。

with_stmt ::=  "with" with_item ("," with_item)* ":" suite
with_item ::=  expression ["as" target]

带有一个“项目”的 with 语句的执行过程如下:

        1. 对上下文表达式 (在 with_item 中给出的表达式) 求值以获得一个上下文管理器。

        2. 载入上下文管理器的 __exit__() 以便后续使用。

        3. 发起调用上下文管理器的 __enter__() 方法。

        4. 如果 with 语句中包含一个目标,来自 __enter__() 的返回值将被赋值给它。

        注解 with 语句会保证如果 __enter__() 方法返回时未发生错误,则 __exit__() 将总是被调用。 因此,如果在对目标列表赋值期间发生错误,则会将其视为在语句体内部发生的错误。 参见下面的第 6 步。

        5. 执行语句体。

        6. 发起调用上下文管理器的 __exit__() 方法。 如果语句体的退出是由异常导致的,则其类型、值和回溯信息将被作为参数传递给 __exit__()。 否则的话,将提供三个 None 参数。

        如果语句体的退出是由异常导致的,并且来自 __exit__() 方法的返回值为假,则该异常会被重新引发。 如果返回值为真,则该异常会被抑制,并会继续执行 with 语句之后的语句。

        如果语句体由于异常以外的任何原因退出,则来自 __exit__() 的返回值会被忽略,并会在该类退出正常的发生位置继续执行。

如果有多个项目,则会视作存在多个 with 语句嵌套来处理多个上下文管理器:

  1. with A() as a, B() as b:
  2.     suite
复制代码


等价于

  1. with A() as a:
  2.     with B() as b:
  3.         suite
复制代码


在 3.1 版更改: 支持多个上下文表达式。

参见
PEP 343 - "with" 语句
Python with 语句的规范描述、背景和示例。

最佳答案

查看完整内容

8.5. with 语句 with 语句用于包装带有使用上下文管理器 (参见 with 语句上下文管理器 一节) 定义的方法的代码块的执行。 这允许对普通的 try...except...finally 使用模式进行封装以方便地重用。 with_stmt ::= "with" with_item ("," with_item)* ":" suite with_item ::= expression ["as" target] 带有一个“项目”的 with 语句的执行过程如下: 1. 对上下文表达式 (在 with_item 中给出的表达式) 求值以获得一个 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-13 20:14:42 | 显示全部楼层    本楼为最佳答案   
8.5. with 语句
with 语句用于包装带有使用上下文管理器 (参见 with 语句上下文管理器 一节) 定义的方法的代码块的执行。 这允许对普通的 try...except...finally 使用模式进行封装以方便地重用。

with_stmt ::=  "with" with_item ("," with_item)* ":" suite
with_item ::=  expression ["as" target]

带有一个“项目”的 with 语句的执行过程如下:

        1. 对上下文表达式 (在 with_item 中给出的表达式) 求值以获得一个上下文管理器。

        2. 载入上下文管理器的 __exit__() 以便后续使用。

        3. 发起调用上下文管理器的 __enter__() 方法。

        4. 如果 with 语句中包含一个目标,来自 __enter__() 的返回值将被赋值给它。

        注解 with 语句会保证如果 __enter__() 方法返回时未发生错误,则 __exit__() 将总是被调用。 因此,如果在对目标列表赋值期间发生错误,则会将其视为在语句体内部发生的错误。 参见下面的第 6 步。

        5. 执行语句体。

        6. 发起调用上下文管理器的 __exit__() 方法。 如果语句体的退出是由异常导致的,则其类型、值和回溯信息将被作为参数传递给 __exit__()。 否则的话,将提供三个 None 参数。

        如果语句体的退出是由异常导致的,并且来自 __exit__() 方法的返回值为假,则该异常会被重新引发。 如果返回值为真,则该异常会被抑制,并会继续执行 with 语句之后的语句。

        如果语句体由于异常以外的任何原因退出,则来自 __exit__() 的返回值会被忽略,并会在该类退出正常的发生位置继续执行。

如果有多个项目,则会视作存在多个 with 语句嵌套来处理多个上下文管理器:

  1. with A() as a, B() as b:
  2.     suite
复制代码


等价于

  1. with A() as a:
  2.     with B() as b:
  3.         suite
复制代码


在 3.1 版更改: 支持多个上下文表达式。

参见
PEP 343 - "with" 语句
Python with 语句的规范描述、背景和示例。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-13 20:29:34 From FishC Mobile | 显示全部楼层
单凭这一两句,俺啥也猜不出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-20 00:08:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-20 14:34:37 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-14 12:43
8.5. with 语句
with 语句用于包装带有使用上下文管理器 (参见 with 语句上下文管理器 一节) 定义的方法的 ...

No Problem. 没毛病!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表