我试图使用types.MethodType来修改某些迭代器的行为。types.MethodType和for循环
def parse(line):
return line.upper()
def reader(f):
f.__next__ = types.MethodType(lambda x: parse(_io.TextIOWrapper.readline(x)), f)
f.__iter__ = types.MethodType(lambda x: x, f)
return f
我想我正确地使用types.MethodType,因为运行下面的代码我得到预期的结果:
>>with open("myfile.txt") as f:
>> x = reader(f)
>> print(f.__next__())
NORMAL LINE
然而,当我使用for循环,似乎不调用parse()函数。
>>with open("myfile.txt") as f:
>> for line in reader(f):
>> print(line)
normal line
这是因为如果for循环使用,而不是覆盖我的一个对象的原始下一个()方法。
我在这里错过了什么?我知道我可以以更简单的方式实现相同的结果,例如在reader()中产生分析的行,但是我真的更喜欢返回这个'装饰'文件对象。
在此先感谢。
在'file'实例上更改方法不太可能;解释器会在某些地方注意到何时存在内置类型,并快速切入某些方法查找。对于被设计为子分类的'dict',它将为覆盖这些方法的子类执行“正确”的事情。但'file'不是为此设计的。你运气不好。 – SingleNegationElimination 2014-09-02 00:38:59
@IfLoop你写的是假的。 *解释器*不会**“优化对内置插件的查找”。当它们被隐式调用时(例如在for循环中),它将* all *访问*特殊方法*。然而,这是为所有**类,而不仅仅是内置的,所以即使是继承'file'代码也能正常工作。你所描述的是用C编写的其他*函数,它可能已经被优化了,但是这与手头的问题和例子完全无关。 – Bakuriu 2014-09-02 07:29:17