GVKun编程网logo

在 Python 中,如果我在“with”块内返回,文件还会关闭吗?(python with return)

19

在本文中,您将会了解到关于在Python中,如果我在“with”块内返回,文件还会关闭吗?的新资讯,同时我们还将为您解释pythonwithreturn的相关在本文中,我们将带你探索在Python中,

在本文中,您将会了解到关于在 Python 中,如果我在“with”块内返回,文件还会关闭吗?的新资讯,同时我们还将为您解释python with return的相关在本文中,我们将带你探索在 Python 中,如果我在“with”块内返回,文件还会关闭吗?的奥秘,分析python with return的特点,并给出一些关于delphi – 重构“with”块的工具、PHPUnit“with”matcher with array和$this-> anything()、Python GC也会关闭文件吗?、python – 用于打开具有两个函数的文件的“with”语法的实用技巧。

本文目录一览:

在 Python 中,如果我在“with”块内返回,文件还会关闭吗?(python with return)

在 Python 中,如果我在“with”块内返回,文件还会关闭吗?(python with return)

考虑以下:

with open(path, mode) as f:    return [line for line in f if condition]

文件会正确关闭,还是使用return某种方式绕过上下文管理器?

答案1

小编典典

是的,它就像一个finally块之后的try块,即它总是执行(当然,除非 python 进程以不寻常的方式终止)。

在PEP-343的示例之一中也提到了它,它是with语句的规范:

with locked(myLock):    # Code here executes with myLock held.  The lock is    # guaranteed to be released when the block is left (even    # if via return or by an uncaught exception).

然而,值得一提的是,如果open()不将整个with块放入try..except通常不是人们想要的块中,您将无法轻松捕获调用引发的异常。

delphi – 重构“with”块的工具

delphi – 重构“with”块的工具

是否有重构工具来删除“with”块?例如转换
with Form1 do
begin
  Height := Blah;
  Blubb := Name;
end;

Form1.Height := Blah;
Blubb := Form1.Name;

其中Form1是VCL TForm.最好它应该与Delphi 2007一起使用.

解决方法

……我认为来自Jacob Thurman / TwoDesk Software的最后一个Castalia可以解决这个问题

PHPUnit“with”matcher with array和$this-> anything()

PHPUnit“with”matcher with array和$this-> anything()

我有一个单元测试测试PDOStatement :: execute()调用date()作为数组元素之一.

就像是:

$stmt->execute(array ('value1','value2',date('Ymd'));

问题是我的断言是使用$this-> anything()来表示日期函数结果.我认为它正在打破,因为它在阵列中.有没有一个好方法来处理这个?

我的断言看起来像:

$mock->expects($this->once())
  ->method('execute')
  ->with(array ('value1',$this->anything()));

解决方法

您不能将参数验证方法传递给数组中的with(). PHPUnit需要迭代数组并检测方法.相反,其中一个方法将传递给方法应接收的每个参数的with()方法.

在您的情况下,该方法将收到一个参数,因此您将使用单个验证.您不能使用通用验证,因此您将使用回调检查阵列内部:

$mock->expects($this->once())
     ->method('execute')
     ->with($this->callback(function($array) {
            return 'value1' == $array[0] && 'value2' == $array[1] && 3 == count($array);
        }));

这在PHPUnit docs中有解释.

Python GC也会关闭文件吗?

Python GC也会关闭文件吗?

考虑下面的Python(2.x)代码:

for line in open('foo').readlines():
    print line.rstrip()

我假设由于打开的文件仍然未被引用,因此必须自动关闭它。我已经阅读了有关Python中的垃圾收集器的信息,该垃圾收集器可释放未使用对象分配的内存。GC是否也足以处理文件?

python – 用于打开具有两个函数的文件的“with”语法

python – 用于打开具有两个函数的文件的“with”语法

假设我想使用以下语法打开一个文本文件进行阅读:
with open(fname,'r') as f:
    # do something
    pass

但如果我发现它以.gz结尾,我会调用gzip.open().

if fname.endswith('.gz'):
    with gzip.open(fname,'rt') as f:
            # do something
            pass
else:
    with open(fname,'r') as f:
            # do something
            pass

如果“做某事”部分很长并且不方便在函数中写入(例如,它会创建一个无法序列化的嵌套函数),使用gzip.open或基于返回的打开调用的最短方法是什么? fname.endswith( ‘广州’)?

解决方法

上下文管理器帮助关闭对象.

但是,您不必创建用作上下文管理器的对象,同时使用它来输入上下文. open()和gzip.open()调用返回一个恰好是上下文管理器的新对象,您可以在输入上下文之前创建它们:

if fname.endswith('.gz'):
    f = gzip.open(fname,'rt')
else:
    f = open(fname,'r')

with f:
    # do something

在这两种情况下,对象在进入上下文时返回self,因此这里不需要使用f作为f.

此外,函数是一等公民,因此您还可以使用变量来存储函数,然后在with语句中调用它来创建上下文管理器和文件对象:

if fname.endswith('.gz'):
    opener = gzip.open
else:
    opener = open

with opener(fname,'rt') as f:  # yes,both open and gzip.open support mode='rt'
    # do something

这并没有真正为你带来任何其他方法,但你可以使用字典将扩展名映射到callables,如果你愿意的话.

底线是calls context-manager hook methods,没有更少,仅此而已.应用之后的表达式应该提供这样的管理器,但是创建该对象不受上下文管理协议的约束.

关于在 Python 中,如果我在“with”块内返回,文件还会关闭吗?python with return的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于delphi – 重构“with”块的工具、PHPUnit“with”matcher with array和$this-> anything()、Python GC也会关闭文件吗?、python – 用于打开具有两个函数的文件的“with”语法的相关知识,请在本站寻找。

本文标签: