【发布时间】:2014-11-29 16:20:58
【问题描述】:
对于处理文件的函数,我需要一个装饰器(或任何其他简洁的设计模式)。主要目的是在函数作用于文件后,将文件指针保持在原来的位置。
这是我的代码,包括一些虚拟测试。问题是装饰器不适用于实例方法,即使我将args 和kwargs 传递给它。我不知道如何设计代码……
import unittest
from cStringIO import StringIO
def remain_file_pointer(file_obj):
def wrap(f):
def wrapped_f(*args, **kwargs):
old_position = file_obj.tell()
f(*args, **kwargs)
file_obj.seek(old_position, 0)
return wrapped_f
return wrap
class TestRemainFilepointer(unittest.TestCase):
def test_remains_filepointer(self):
dummy_file = StringIO('abcdefg')
@remain_file_pointer(dummy_file)
def seek_into_file(dummy_file):
dummy_file.seek(1, 0)
self.assertEqual(0, dummy_file.tell())
seek_into_file(dummy_file)
self.assertEqual(0, dummy_file.tell())
def test_remains_filepointer_in_class_method(self):
class FileSeekerClass(object):
def __init__(self):
self.dummy_file = StringIO('abcdefg')
@remain_file_pointer(self.dummy_file)
def seek_into_file(self):
self.dummy_file.seek(1, 0)
fileseeker = FileSeekerClass()
self.assertEqual(0, fileseeker.dummy_file.tell())
fileseeker.seek_into_file()
self.assertEqual(0, fileseeker.dummy_file.tell())
更新: 只是为了澄清基本思想:
装饰器应该接受一个参数,它是一个文件处理程序,并在实际函数操作文件之前存储位置。之后,指针应设置到旧位置。这应该适用于独立函数和方法。
我的回答通过假设函数中的最后一个参数是文件处理程序来解决问题。
【问题讨论】: