首页 > 解决方案 > 在 python 3 中覆盖 file.write

问题描述

我知道 SO post How do I override file.write() in Python 3? 但是在查看并尝试了建议的内容之后,我仍然被卡住了。

我想覆盖 Python 3 中的 file.write 方法,以便我可以“编辑”某些单词(用户名、密码……等)。

我找到了一个很好的例子来覆盖打印和通用标准输出和标准错误http://code.activestate.com/recipes/119404/

问题是它不适用于 file.write。如何覆盖 file.write?

我在打印时进行编辑的代码是:

   def write(self, text):
        for word in self.redacted_list:
            text = text.replace(word, "REDACTED")
        self.origOut.write(text)
        return text

谢谢

标签: python-3.x

解决方案


self.origOut.write(text)我假设您正在尝试编写一个伪装成文件但提供不同.write()方法的中间类。我在您发布的代码中没有看到任何问题(假设它是您使用的类的方法)。可能你写了一个类但忘记创建它的实例?
你试过写这样的东西吗?:

class IAmNoARealFile:
    def __init__(self, real_file):
        self.origOut = real_file

    def __getattr__(self, attr_name):  # provide everything a file has
        return getattr(self.origOut, attr_name)

    def write(self, ...):
        ...


with open('test.txt', 'w') as f:
    f = IAmNotARealFile(f)  # did you forget this?
    f.write('some text SECRET blah SECRET')  # calls IAMNotARealFile.write with your extra code

with open('test.txt') as f:
    f = IAmNotARealFile(f)
    print(f.read())  # this "falls through" to the actual file object

如果您没有特定的理由不这样做,您可能也想return self.origOut.write()自己做。.write()

请注意,如果您重写open()为直接返回IAMNotARealFile

def open(*args, **kwargs):
    return IAMNotARealFile(open(*args, **kwargs))

您将不得不手动提供(一些)“魔术方法”,因为

由于通过语言语法或内置函数隐式调用而查找特殊方法时,仍可能绕过此方法。请参阅特殊方法查找。

--docs for .__getattribute__(),但它也适用于.__getattr__()

为什么?

以这种方式绕过__getattribute__()机制为解释器中的速度优化提供了很大的空间,但代价是处理特殊方法时具有一定的灵活性(特殊方法必须在类对象本身上设置,以便解释器始终如一地调用) .

-- 关于特殊(“魔术”)方法查找[代码风格和强调我的]


推荐阅读