【问题标题】:support filename, path, and buffer input支持文件名、路径和缓冲区输入
【发布时间】:2021-07-28 16:18:59
【问题描述】:

我的 Python 包中的一个常见要求是允许文件输入为字符串文件名、pathlib.Path 或已打开的缓冲区。我通常像

那样分离出缓冲区
def foo_from_file(filename, *args, **kwargs):
    with open(filename) as f:
        foo_from_buffer(f, *args, **kwargs)


def foo_from_buffer(f):
    f.readline()
    # do something
    return

但从用户的角度来看,一种更简洁的方法可能是

def foo(file_or_buffer):
    if hasattr(file_or_buffer, "readline"):  # ???
        f = file_or_buffer
    else:
        f = open(file_or_buffer)

    f.readline()

(这个特定的实现不是很好,因为它在失败时不会close()。)

file_or_buffer 是 Python 方法中的常见参数,还是您将两者分开?如何最好地实现它?

【问题讨论】:

    标签: python io


    【解决方案1】:

    改编自 similar type of question 我对已经打开的数据库连接可能已作为参数传入或不作为参数进行调整,当您传入的任何内容具有 @987654323 时,您可以使用 nullcontext“什么也不做” @:

    from contextlib import nullcontext
    from pathlib import Path
    from io import StringIO
    
    def foo(file_or_buffer):
        if hasattr(file_or_buffer, "readline"):
            cm = nullcontext(file_or_buffer)
        else:
            cm = open(file_or_buffer)
    
        with cm as f:
            line = f.readline()
            print(line)
        
    pa = Path(__file__)
    
    foo(pa)
    foo(f"{pa}")
    
    with pa.open() as fi:
        foo(fi)
    with pa.open() as fi:
        buffer = StringIO(fi.read())
    foo(buffer)
    
    

    输出:

    from contextlib import nullcontext
    
    from contextlib import nullcontext
    
    from contextlib import nullcontext
    
    from contextlib import nullcontext
    

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 2023-04-03
      • 2013-03-26
      • 2014-07-08
      • 1970-01-01
      • 2019-04-11
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多