有没有办法用with语句开始一段代码,但是有条件地?
就像是:
if needs_with():
with get_stuff() as gs:
# do nearly the same large block of stuff,
# involving gs or not, depending on needs_with()
Run Code Online (Sandbox Code Playgroud)
为了澄清,一种情况会在with语句中包含一个块,而另一种情况可能是同一个块,但不包含(即,好像它没有缩进)
最初的实验当然会给出压痕错误..
python conditional indentation with-statement conditional-statements
而不是这个:
FILE = open(f)
do_something(FILE)
FILE.close()
Run Code Online (Sandbox Code Playgroud)
最好使用它:
with open(f) as FILE:
do_something(FILE)
Run Code Online (Sandbox Code Playgroud)
如果我有这样的东西怎么办?
if f is not None:
FILE = open(f)
else:
FILE = None
do_something(FILE)
if FILE is not None:
FILE.close()
Run Code Online (Sandbox Code Playgroud)
当do_something也有一个"如果文件是无"的条款,而且还做一些有用的事情在这种情况下-我不希望只是跳过do_something如果FILE是无.
是否有一种合理的方式将其转换为/作为形式?或者我只是想以错误的方式解决可选文件问题?
我认为这是经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,可以将开放资源作为参数传递(如文件或数据库连接对象),或者需要自己创建一个函数。如果函数需要自己打开文件,最佳实践通常被认为是这样的:
with open(myfile) as fh:
# do stuff with open file handle...
Run Code Online (Sandbox Code Playgroud)
确保with退出块时文件始终关闭。但是,如果在函数中传递现有文件句柄,则该函数可能不应该关闭它本身。
考虑以下函数,它接受一个打开的文件对象或一个给出文件路径的字符串作为其参数。如果传递的是文件路径,则可能应该按上面的方式编写。否则该with语句应被省略。这会导致重复的代码:
def foo(f):
if isinstance(f, basestring):
# Path to file, need to open
with open(f) as fh:
# do stuff with fh...
else:
# Assume open file
fh = f
# do the same stuff...
Run Code Online (Sandbox Code Playgroud)
当然,可以通过定义一个辅助函数并在两个地方调用它来避免这种情况,但这看起来不太优雅。我想到的一个更好的方法是定义一个上下文管理器类来包装一个对象,如下所示:
class ContextWrapper(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __enter__(self):
return self.wrapped
def __exit__(self, *args):
pass
def foo(f):
if isinstance(f, basestring):
cm = open(f)
else: …Run Code Online (Sandbox Code Playgroud)