python-3.x - 在 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
谢谢
解决方案
从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__()
机制为解释器中的速度优化提供了很大的空间,但代价是处理特殊方法时具有一定的灵活性(特殊方法必须在类对象本身上设置,以便解释器始终如一地调用) .
-- 关于特殊(“魔术”)方法查找[代码风格和强调我的]
推荐阅读
- python - 如何从搜索中获取结果 URL?
- python-3.x - 如何将用户输入永久添加到字典
- haskell - Haskell:更改列表中每个元素的数据类型
- python - 在 Pyqt5 DESIGN 上显示来自 sqlite 的 BLOB 数据
- javascript - 有没有办法保留每个当前的用户 ID,所以我可以在猫鼬钩子中使用它?
- javascript - 如何使用 Node.js 和 Firebase 制作实时列表
- ssl - Traefik 2.0 TLS TCP 直通
- python - parquet int96时间戳通过python转换为日期时间/日期
- javascript - 使用 jQuery 从类中获取特定的用户数据
- node.js - 如何在 Node.js 中使用 RESTful API