【问题标题】:What's the use of the "with" statement in Python? [closed]Python中的“with”语句有什么用? [关闭]
【发布时间】:2019-04-02 11:24:33
【问题描述】:

在 Python 中编程时,有时我需要启动函数和对象方法,如下所示:

obj1.launch_method1(); // object method
do_something();        // general function
obj1.launch_method2(); // object method

使用with 语句,变为:

with obj1:
  launch_method1();
  do_something();
  launch_method2();

在我看来,这会引起混淆,因为下一个程序员可能会错误地认为do_something() 是一个对象方法而不是一个通用函数。

最重要的是,大多数 IDE 都具有智能感知功能,因此当您键入 obj1.(注意点)时,会出现一个方法和属性列表,这使得键入 obj1.launch_method1()obj1.launch_method2() 之类的内容变得非常容易, ...

因此,从程序员的角度来看,with 语句的使用似乎没有优势。

但是,with 语句似乎启动了__enter____exit__ 调用,这似乎创建了新的上下文。那些电话是什么?这是什么意思? with 语句的使用有什么不同吗?如果有,是哪一个?

【问题讨论】:

  • 如果下一个程序员混淆了 Python with 语句和 Pascal with 语句,他只会错误地认为do_something() 是一个对象方法。 with obj1: launch_method()obj1.launch_method() 相同。查看上下文管理器的文档。去掉分号;这是帕斯卡的另一个习惯。
  • 我投了反对票,因为这个问题似乎是用完全不同的语言描述 with 语句。给出的这个代码示例的行为方式与 Python 中描述的方式不同。过多的分号让我怀疑他们是想问关于 Javascript 的问题。第一个代码块中的 cmets 也不是 Python 语法。
  • 我投票决定将此问题作为题外话结束,因为尽管它声称与 Python 有关,但它似乎与 Javascript 有关。
  • 查看标准with open("file") as f:会显示,不能删除任何标识符。 enterexit 创建和销毁范围内唯一的上下文,那么哪个应该是新的?

标签: python language-lawyer with-statement


【解决方案1】:

with 语句是一个上下文管理器。这负责构建和分解资源。

例如,如果您需要使用一个文件,传统上您必须打开该文件,然后记得关闭它。 with open 语句会为您解决这个问题。

with open(“file.txt”) as file:  
    data = file.read() #Context of the file open

enter 方法打开文件exit 将其关闭。

现在,这似乎需要付出很多努力才能获得微薄的收益,但请考虑一个存在大量构建和崩溃的系统。您可以轻松构建自己的上下文管理器。

例如打开套接字、握手、身份验证和授权都可以进入 enter 方法,然后再将其全部分解为 Exit 方法

那么就跟在需要的时候使用上下文一样简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2011-04-18
    • 1970-01-01
    • 2011-02-13
    • 2021-01-01
    • 1970-01-01
    • 2019-08-15
    • 2017-01-31
    相关资源
    最近更新 更多