Skip to main content
 首页 » 编程设计

python之与 'as' 关键字一起使用时覆盖 python open 函数以打印任何内容

2025年05月04日15zdz8207

我如何覆盖内置的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())