覆盖python 3中的file.write

时间:2019-01-11 19:02:11

标签: python-3.x

我知道How do I override file.write() in Python 3?这样的SO帖子,但是在仔细研究并尝试了建议之后,我仍然很困惑。

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

我找到了一个很好的例子,它可以覆盖print以及一般的stdout和stderr 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

谢谢

1 个答案:

答案 0 :(得分:0)

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))

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

  

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

-.__getattribute__()的文档,但也适用于.__getattr__()

为什么?

  

以这种方式绕过__getattribute__()机制为解释器内的速度优化提供了很大的范围,但以牺牲一些特殊方法的灵活性为代价(特殊方法必须在类对象上设置以便被解释程序一致地调用)

-在special ("magic") method lookup上[代码样式和重点代码]