首页 > 编程问答 >Python,“pathlib.Path.open()”方法和内置函数“open()”不返回“typing.IO”的实例

Python,“pathlib.Path.open()”方法和内置函数“open()”不返回“typing.IO”的实例

时间:2024-07-24 12:37:32浏览次数:16  
标签:python python-typing

我读过一些 其他答案 ,它们似乎与现实生活中发生的事情相矛盾。

尝试以下操作:

from typing import IO
from pathlib import Path

example_path = Path(r"D:\Example.txt")
with example_path.open("r") as f:
    print(isinstance(f, IO))
with open(example_path) as f:
    print(isinstance(f, IO))

它将打印:

False
False

这令人困惑,因为根据 文档 ,在我看来, typing.IO 的真正目的之一是对对象的 IO 类型进行类型检查,这将包括 isinstance() 的使用。为什么不起作用?这不是违背了初衷吗?我在这里缺少什么?


你对于 typing.IO 的理解不完全正确。 typing.IO 本身并不直接用于 isinstance 检查。它是一个 泛型类 ,用来表示各种类型的文件类对象,例如文本文件 ( TextIO ) 和二进制文件 ( BinaryIO )。

问题根源:

  • pathlib.Path.open() open() 返回具体的类: 这些函数返回的不是 IO 类型,而是更具体的类型,例如 TextIOWrapper (对于文本模式) 或 BufferedReader (对于二进制模式)。这些具体类型是 IO 子类 ,但并不直接等同于 IO

  • isinstance 和泛型: isinstance 用于检查对象的类型是否与指定的类型 完全相同 是其子类 。由于 IO 是一个泛型类,它并不能直接代表具体的文本或二进制文件类型,所以 isinstance 检查会返回 False

解决方案:

为了进行类型提示和检查,你可以使用更具体的类型提示:

from typing import TextIO, BinaryIO
from pathlib import Path

example_path = Path(r"D:\Example.txt")

# 对于文本文件:
with example_path.open("r") as f:
    print(isinstance(f, TextIO))  # 输出 True

# 对于二进制文件:
with example_path.open("rb") as f:
    print(isinstance(f, BinaryIO))  # 输出 True

总结:

  • typing.IO 用于表示泛型文件类型,不建议直接用于 isinstance 检查。
  • 使用 TextIO BinaryIO 来进行更具体的类型提示和检查。
  • pathlib.Path.open() open() 返回的具体类型取决于打开文件的模式。

标签:python,python-typing
From: 72046372

相关文章

  • 【Dison夏令营 Day 28】用 Python 创建恐龙游戏
    谁没有玩过谷歌著名的“恐龙游戏”?也许每个人都玩过这个游戏。今天,在这篇文章中,我们将帮助你用Python开发一个恐龙游戏。本教程将深入讲解每一行代码,并提供参考资料。我们将尽力让读者详细、透彻地理解这个项目。Python版恐龙游戏的任务记录包括图片文档和Python资料......
  • Python 无法 pickle 自定义类型
    我正在尝试在ProcessPool中运行一个函数,该函数将通过读取python文件并运行生成的类中的方法来加载一些自定义类。我遇到的错误是TypeError:cannotpickle'generator'object该方法需要返回一个生成器。我该如何解决这个问题,谢谢。我用谷歌搜索但没有运气。......
  • python 语法无效?
    我试图编写一些Python代码,但由于某些奇怪的原因,它重复了无效的语法,我不知道最大的问题是什么。这些行是文件中唯一的代码行。Age=int(input("Howoldareyou?:"))ifAge>=18:print("YouareaAdult!")我尝试更改行,因为这似乎是我的生气,但它没有做任何帮......
  • 如何在Python的matplotlib中将条形标签绘制到右侧并为条形标签添加标题?
    我已经在python中的matplotlib中创建了一个图表,但是以下代码中的最后一行不允许在图表之外对齐条形标签。importmatplotlib.pyplotaspltg=df.plot.barh(x=name,y=days)g.set_title("Dayspeopleshowedup")g.bar_label(g.containers[0],label_type='edge')我得......
  • 19、Python之容器:快来数一数,24678?Counter能数得更好
    引言关于数据的分组计数,前面的文章中已经涉及了很多次。眼下要进行分组计数,我们可用的方法有:1、直接使用dict进行计数,需要对首次出现的键进行判断初始化的操作;2、使用dict的setdefault()方法进行计数,代码可以简化一些,虽然方法名有点怪;3、defaultdict进行计数,可以设置自动......
  • 如何使用 C# 检查用户是否安装了最低 Python 版本并且可以访问我的代码?
    我正在开发一个C#程序,该程序必须为一项特定任务运行一些Python代码。(Python代码很复杂,是由另一个团队开发的。无法在C#中重现其功能。)我正在尝试更新我的程序的安装程序文件以解决此问题:我希望它检查用户是否(谁正在安装我的程序)已安装Python并且它满足我的最低版......
  • 如何优雅地将复杂的Python对象和SQLAlchemy对象模型类结合起来?
    我有一个相当复杂的类,具有从提供的df到init计算的复杂属性,这些属性可能是最终可以序列化为字符串的其他类类型。在Python中,我想处理对象而不是原始类型,但也想使用SQLAlchemy与数据库交互。表中的列与许多类属性相同,如何优雅地组合这两个类?我可以使用组合并将数据......
  • Python Match Case:检查未知长度的可迭代内部的类型
    我想使用匹配大小写检查一个未知长度的迭代(假设为list)仅包含给定类型(假设为float)(还有其他情况,只有这个给我带来了问题)。case[*elems]ifall([isinstance(elem,float)foreleminelems]):returnnum这个似乎可行,但确实很不Pythony。看来应该有更简单的方法。......
  • Python实现excel数据的读取和写入
    1.安装说到前面的话,实现excel文件数据的读取和写入,在python中还有其它方法,比如说pandas。鉴于最近粉丝朋友问到上面的“xlrd”和“xlwt”,那么笔者下面将通过这两个方法,来实现excel文件数据的读取和写入。首先,我们先需要提前安装好对应的库。需要注意的是,xlrd从2.0版本开始,只......
  • python_进程与线程_多线程
    一、程序与进程的概念1、进程:指启动后的程序,系统会为进程分配内存空间二、创建进程的方式1、第一种创建进程的方式process(group=None,target,name,args,kwargs)group:表示分组,实际上不使用,默认为None即可target:表示子进程要执行的任务,支持函数名name:表示子进程的......