如何在Python函数中接受文件名和类文件对象?
在我的代码中,我有一个 load_dataset 函数,它读取文本文件并进行一些处理。最近,我考虑添加对类文件对象的支持,并且我想知道对此的最佳方法。目前我想到了两种实现:
首先,类型检查:
if isinstance(inputelement, basestring):
# open file, processing etc
# or
# elif hasattr(inputelement, "read"):
elif isinstance(inputelement, file):
# Do something else
或者,两个不同的论点:
def load_dataset(filename=None, stream=None):
if filename is not None and stream is None:
# open file etc
elif stream is not None and filename is None:
# do something else
但这两种解决方案都没有让我太信服,尤其是第二个,因为我看到了太多的陷阱。
将类似文件的对象或字符串接受到执行文本读取的函数的最干净(也是最Pythonic)的方法是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
将文件名或类文件对象作为参数的一种方法是实现 此处找到实现,我引用是为了一个独立的答案:
然后可能的用法:
One way of having either a file name or a file-like object as argument is the implementation of a context manager that can handle both. An implementation can be found here, I quote for the sake of a self contained answer:
Possible usage then:
不要同时接受文件和字符串。如果您要接受类似文件的对象,则意味着您不会检查类型,只需在实际参数上调用所需的方法(
read
、write
, ETC。)。如果您要接受字符串,那么您最终将open
-ing 文件,这意味着您将无法模拟参数。所以我会说接受文件,让调用者向您传递一个类似文件的对象,并且不检查类型。Don't accept both files and strings. If you're going to accept file-like objects, then it means you won't check the type, just call the required methods on the actual parameter (
read
,write
, etc.). If you're going to accept strings, then you're going to end upopen
-ing files, which means you won't be able to mock the parameters. So I'd say accept files, let the caller pass you a file-like object, and don't check the type.我正在使用上下文管理器包装器。当它是文件名 (str) 时,退出时关闭文件。
然后你可以像这样使用它:
I'm using a context manager wrapper. When it's a filename (str), close the file on exit.
Then you can use it like:
Python遵循鸭子类型,您可以通过对象中需要的函数检查这是否是文件对象。例如,
hasattr(obj, 'read')
与isinstance(inputelement, file)
相对。为了将字符串转换为文件对象,您还可以使用这样的构造:
在这段代码之后,您将能够安全地使用
obj
作为文件。Python follows duck typing, you may check that this is file object by function that you need from object. For example
hasattr(obj, 'read')
againstisinstance(inputelement, file)
.For converting string to file objects you may also use such construction:
After this code you will safely be able to use
obj
as a file.