如何稍微修改Python内置函数比如splitlines()的行为?

我的需求是按行分割且保留换行符,只分割 \r\n 的换行,但是 splitlines() 函数默认还会分割 \r 或者 \n 的行。
的确可以通过 split 分割 \r\n,然后在去拼,但是感觉这样很繁琐,如果可以直接重载内置函数把 \r 和 \n 的匹配去掉,这样肯定是最便捷。
不知该如何处理,望指教~
要实现的效果:
str1 = ‘123\r\n456\r789\n000\r\n111’
结果:
[‘123\r\n’, ‘456\r789\n000\r\n’, ‘111’]
如何稍微修改Python内置函数比如splitlines()的行为?


10 回复

有空纠结怎么修改 splitlines 的功夫不如直接 split 自己写一个


# 方法1:直接包装内置函数
def my_splitlines(text, keepends=False):
    """自定义splitlines,在标准行为基础上添加额外处理"""
    result = text.splitlines(keepends)
    # 这里添加你的自定义逻辑
    if keepends:
        result = [line + ' [processed]' for line in result]
    return result

# 方法2:子类化str(更面向对象的方式)
class MyString(str):
    def splitlines(self, keepends=False):
        base_result = super().splitlines(keepends)
        # 添加自定义处理
        return [f"Line {i}: {line}" for i, line in enumerate(base_result, 1)]

# 方法3:猴子补丁(谨慎使用)
original_splitlines = str.splitlines

def patched_splitlines(self, keepends=False):
    result = original_splitlines(self, keepends)
    # 自定义逻辑
    return [line.upper() if keepends else line.lower() for line in result]

# 临时替换(通常只在当前会话有效)
str.splitlines = patched_splitlines

# 测试示例
text = "Hello\nWorld\nPython"

print("方法1测试:", my_splitlines(text))
print("方法2测试:", MyString(text).splitlines())
print("方法3测试:", text.splitlines())

# 恢复原始函数(如果需要)
str.splitlines = original_splitlines

核心思路:

  • 包装函数:创建新函数调用原函数并添加逻辑
  • 子类化:创建自定义字符串类重写方法
  • 猴子补丁:直接替换原函数(可能影响其他代码)

简单建议: 优先使用包装函数或子类化,避免直接修改内置函数。

我记得可以 open(something, “rU”)

不麻烦啊 [ “”.join([line, “\r\n”]) for line in str1.split("\r\n")]

自己写一个有啥难度嘛= =

Monkey-patching

看源码 是不是个类, 继承下?

这个函数加参数 ture 不是保留换行符吗?

class StrMixin:
self.delimiter = ’ \r\n’
def splitelines(self, s): return [k+self.delimiter for k in s.split(self.delimeter)]

谢谢各位!!

回到顶部