支持文件名、路径和缓冲区输入



我的Python包中的一个常见要求是允许以字符串文件名或pathlib的形式输入文件。路径或已打开的缓冲区。我通常像一样分离缓冲区

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方法中的一个常见参数,还是将两者分开?如何最好地实施它?

根据我对一个已经打开的数据库连接的类似问题进行调整,该连接本可以作为参数传入或不作为参数传入,您可以使用nullcontext来"什么都不做";当你通过的任何东西都有readline:

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

相关内容

最新更新