我希望有一个在初始化过程中传递字符串或已打开文件的类.如果它得到一个字符串,就会打开文件.

from typing import IO

class Parser:
  def __init__(self, fin: str|IO[str]) -> None:
    if isinstance(fin, str):
      self.fin = open(fin, 'r')
    else:
      if not fin.readable():
        raise ValueError("Input file must be readable.")
      else:
        self.fin = fin

我的问题是,如果文件被打开,关闭它的正确方法是什么.我原以为可以用__del__法来解决这个问题,但读了之后,大家似乎一致认为使用__del__不是一个好主意.有没有更好的方法?

推荐答案

提供一个单独的类方法来处理使用上下文管理器打开和关闭文件的问题.

from contextlib imp或t contextmanager


class Parser:
    def __init__(self, fh: IO[str]) -> None:
        if not fh.readable():
            raise ValueErr或(...)
        self.fh = fh

    # Typing-hinting is out of scope f或 this question, so I'm
    # just using the Python-3.11-style Self hint f或 simplicity.
    @classmethod
    @contextmanager
    def from_filename(cls: Self, name: str) -> Self:
        with open(name) as fh:
            yield Parser(fh)

现在您可以使用

with open("some_file.txt") as fh:
    p = Parser(fh)
    ...

with Parser.from_filename("some_file.txt") as p:
    ...

Python相关问答推荐

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

根据条件将新值添加到下面的行或下面新创建的行中

如何将双框框列中的成对变成两个新列

如何让剧作家等待Python中出现特定cookie(然后返回它)?

Python中的嵌套Ruby哈希

在线条上绘制表面

Python逻辑操作作为Pandas中的条件

python sklearn ValueError:使用序列设置数组元素

30个非DATETIME天内的累计金额

处理Gekko的非最优解

将链中的矩阵乘法应用于多组值

使用Python异步地持久跟踪用户输入

GPT python SDK引入了大量开销/错误超时

如何获得3D点的平移和旋转,给定的点已经旋转?

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

Python日志(log)库如何有效地获取lineno和funcName?

#将多条一维曲线计算成其二维数组(图像)表示

将标签与山脊线图对齐

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件