gpt4 book ai didi

python 3 : Determine if object supports IO

转载 作者:行者123 更新时间:2023-11-28 23:05:37 24 4
gpt4 key购买 nike

一些 Python 方法适用于各种输入源。例如,XML 元素树 parse 方法采用一个对象,该对象可以是字符串(在这种情况下 API 将其视为文件名),也可以是支持 IO 接口(interface)的对象,如文件对象或 io.StringIO

所以,很明显,parse 方法正在执行某种接口(interface)嗅探,以确定要采取的操作过程。我想实现这一点的最简单方法是通过说 isinstance(x, str) 检查输入参数是否为字符串,如果是,则将其视为文件名,否则将其视为IO 对象。

但为了更好的错误检查,我认为最好检查 x 是否支持 IO 接口(interface)。检查对象是否支持指定接口(interface)的标准惯用方法是什么?

我想,一种方法是直接说:

if "read"in x.__class__.__dict__: # 检查对象是否有读取方法

但仅仅因为 x 有一个“读取”方法并不一定意味着它支持 IO 接口(interface),所以我假设我还应该检查 IO 接口(interface)中的每个方法。这通常是执行此操作的最佳方法吗?或者我应该忘记检查接口(interface),而让可能的 AttributeError 在堆栈的更上层得到处理?

最佳答案

Python 强烈鼓励鸭子类型:假设传入的对象有效并尝试使用它。这样,您的代码就尽可能灵活。当然,如果代码的操作取决于传入对象的类型,则确实需要某种类型检查。不过,我建议将这种类型检查保持在最低限度,并使用 isinstance(x, str)

如果您传入既不是字符串也不支持 IO 接口(interface)的对象,这将导致 AttributeError。如果发生这种情况,则这是调用代码中的错误。不应在任何地方处理此异常——而是应修复错误!

也就是说,您可以使用

isinstance(x, io.IOBase)

测试支持 I/O 协议(protocol)的内置类。不过,这会将您的代码限制为实际上派生自 io.IOBase 的类——这是一种肤浅且不必要的限制。

关于 python 3 : Determine if object supports IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5857951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com