gpt4 book ai didi

python - 如何在 with 和 for 语句之前创建一个与 open() 具有相同行为的对象

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:06 26 4
gpt4 key购买 nike

我想在 Python 中创建一个类,它接收文件名,并返回一个可由上下文管理器处理并可通过 for 循环迭代的对象。

基本上,文件将被逐行解析(可迭代)。该类将把每一行分割成一个定义的模式,并在迭代的每一步返回一个值的元组。

我知道我需要实现__iter__ , __next__使其可迭代的方法,但我不清楚如何继续。该文件是我的类属性之一,我希望迭代器在每次迭代时生成已解析的行。

我也知道我需要实现 __enter____exit__方法,但这对我来说也有点模糊。

class myfile:
def __init__(self,file,**kwargs):
self._file = open(file,'r')

def __del__(self):
self._file.close()

def __enter__(self):
# Not sure what am I supposed to return here

def __exit__(self):
self._file.close()

def __iter__(self):
# What iterator must be returned

def __next__(self):
return parseLine(x)

def parseLine(self,line):
#Stuff:
return *values

我并不是在寻找开箱即用的代码,而是想了解每种神奇方法到底需要什么才能正确工作才能获得所需的行为。

更新:

我最终决定按照以下方式进行:

class myfile:
def __init__(self,file,**kwargs):
self._file = open(file,'r')

def __del__(self):
self._file.close()

def __enter__(self):
return self

def __exit__(self, type, value, traceback):
self._file.close()

def __iter__(self):
for fline in self._file:
yield self.parseLine(fline)

def parseLine(self,line):
# Stuff
return *values

它似乎有我正在寻找的行为。当我执行以下操作时它会起作用:

with myfile(r'x.txt') as pf:
for i in pf:
print(i)

这是实现这一目标的好方法吗?它足够Pythonic吗?

最佳答案

只需返回self在这两种情况下。

你的类本身就是迭代器(因为你提供了 __next__ 方法),并且如果你没有 __enter__ 的特殊值要返回,您通常只需返回 self .

事实上,这正是文件对象在这两种情况下所做的事情:

>>> fobj = open('/dev/null')
>>> fobj.__enter__() is fobj
True
>>> fobj.__iter__() is fobj
True

对于__iter__如果你想支持对象的独立迭代,你会返回一个不同的对象;该新对象将返回 self对于 __iter__并提供__next__方法而不是此类。

对于__enter__您将返回用户方便绑定(bind)到 with 中的任何内容。陈述。例如,某些数据库连接对象返回一个新的游标对象,这样您就可以执行以下操作:

with conn as cursor:
# handle a transaction, using the already produced cursor

请注意,您的更新版本从 __iter__ 返回一个生成器 ,每次调用 iter(myfile('...')) 时,它都是一个迭代器。这些迭代器并不像 iter(fileobj) 那样真正独立。将始终返回文件对象本身,因此随着文件位置的前进,迭代一个生成器将影响其他生成器。

此外,由于文件对象是它们自己的迭代器,因此您可以使用 next() function直接在文件对象上,但您不能对您的对象执行相同的操作。

更好的解决方案是坚持返回 self并让您的 __next__方法进行解析:

def __iter__(self):
return self

def __next__(self):
return self.parseLine(next(self._file))

关于python - 如何在 with 和 for 语句之前创建一个与 open() 具有相同行为的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967060/

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