相关疑难解决方法(0)

'with'语句中有多个变量?

是否可以使用withPython中的语句声明多个变量?

就像是:

from __future__ import with_statement

with open("out.txt","wt"), open("in.txt") as file_out, file_in:
    for line in file_in:
        file_out.write(line)
Run Code Online (Sandbox Code Playgroud)

......还是正在清理两个资源同时出现问题?

python with-statement

347
推荐指数
6
解决办法
11万
查看次数

Pythonic为类所拥有的对象组成上下文管理器的方法

对于某些任务,通常需要多个具有明确释放资源的对象 - 例如,两个文件; 当任务是使用嵌套with块的函数的本地任务时,这很容易完成,或者 - 甚至更好 - with具有多个with_item子句的单个块:

with open('in.txt', 'r') as i, open('out.txt', 'w') as o:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

OTOH,当这些对象不仅仅是函数作用域的本地对象,而是由类实例拥有 - 换句话说,上下文管理器如何构成时,我仍然很难理解它应该如何工作.

理想情况下,我想做的事情如下:

class Foo:
    def __init__(self, in_file_name, out_file_name):
        self.i = WITH(open(in_file_name, 'r'))
        self.o = WITH(open(out_file_name, 'w'))
Run Code Online (Sandbox Code Playgroud)

并有Foo自己变成上下文管理,处理io,这样,当我做

with Foo('in.txt', 'out.txt') as f:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

self.iself.o按照您的预期自动处理.

我修改了写东西,比如:

class Foo:
    def __init__(self, in_file_name, out_file_name):
        self.i = open(in_file_name, 'r').__enter__()
        self.o = open(out_file_name, 'w').__enter__()

    def __enter__(self):
        return …
Run Code Online (Sandbox Code Playgroud)

python contextmanager

23
推荐指数
4
解决办法
937
查看次数

是否可以在python中使用`with`打开任意数量的项目?

我有一个情况,我有几个项目,我想用with块打开.在我的情况下,这些是外部硬件设备,在关闭时需要进行一些清理 - 但这对于手头的要点并不重要.

假设一个类是这样的:

class Controller(object):

    def __init__(self, name):
        self._name = name

    def __enter__(self):
        # Do some work on entry
        print("Entering", self._name)
        return self

    def __exit__(self, type, value, traceback):
        # Clean up (restoring external state, turning off hardware, etc)
        print("Exiting", self._name)
        return False

    def work(self):
        print("Working on", self._name)
Run Code Online (Sandbox Code Playgroud)

我会(给定一定数量的Controllers),做类似的事情

with Controller("thing1") as c1:
    with Controller("thing2") as c2:
        c1.do_work()
        c2.do_work()
Run Code Online (Sandbox Code Playgroud)

但是,我遇到过这样一种情况:我需要以这种方式管理一些灵活的事情.也就是说,我的情况类似于:

things = ["thing1", "thing2", "thing3"] # flexible in size
for thing in things:
    with Controller(thing) as …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

6
推荐指数
1
解决办法
229
查看次数