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

标签 python

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

相关文章:

python - 希望在 pytest 输出中查看取消选择的测试列表及其节点 ID

python - 为什么蜘蛛不返回该网站的任何响应?

python - ThreadPoolExecutor 内部结构

python - 用 Python 做会计的最佳实践

python - 验证我对涉及 return 语句的 lambda 的理解

python - 如何避免从 Bash 脚本多次调用 Python 解释器?

python - 生成广义汉明数 Python

python - 如何通过 DeclarativeMeta 接口(interface)使用反射表?

python - 在 Python 中捕获 netcat shell 命令输出

python - 如何使用 Python 实现用户身份验证和 session