我如何覆盖内置的open
函数,这样当我这样调用它时...
with open(file_path, "r") as f:
contents = f.read()
contents
变量是我想要的任何字符串?
编辑:澄清一下,我希望能够只向打开函数提供一个字符串,而不是将要读取的文件路径。
with open("foobar") as f:
contents = f.read()
print(contents)
上面应该打印 foobar。
我知道这违背了打开等的目的,但它是为了测试目的。
最佳答案
您可以创建自己的类文件类型并使用您自己的 open
函数覆盖内置的 open
。
import builtins
import contextlib
class File(object):
"""
A basic file-like object.
"""
def __init__(self, path, *args, **kwargs):
self._fobj = builtins.open(path, *args, **kwargs)
def read(self, n_bytes = -1):
data = self._fobj.read(n_bytes)
...
return data
def close(self):
self._fobj.close()
@contextlib.contextmanager
def open(path, *args, **kwargs):
fobj = File(path, *args, **kwargs)
try:
with contextlib.closing(fobj):
yield fobj
finally:
pass
您可以在 File.read
本身中添加调整 read()
的返回值所需的任何行为或附加逻辑,或者完全从文件
。
针对所讨论的特定情况进行了简化:
class File(str):
def read(self):
return str(self)
@contextlib.contextmanager
def open(string):
try:
yield File(string)
finally:
pass
with open('foobar') as f:
print(f.read())
关于python - 与 'as' 关键字一起使用时覆盖 python open 函数以打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45950221/