| 
498
 | 
     1 #!/usr/bin/env python
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 """
 | 
| 
 | 
     4 filename -> file-like object as a decorator
 | 
| 
 | 
     5 """
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 import optparse
 | 
| 
 | 
     8 import os
 | 
| 
 | 
     9 import sys
 | 
| 
 | 
    10 
 | 
| 
 | 
    11 string = (basestring,)
 | 
| 
 | 
    12 
 | 
| 
 | 
    13 class fileobj(object):
 | 
| 
 | 
    14     def __init__(self, arg, *args, **kwargs):
 | 
| 
 | 
    15         self._args = [arg] + list(args)
 | 
| 
 | 
    16         self._kwargs = kwargs
 | 
| 
 | 
    17         # mode, filename, ...
 | 
| 
 | 
    18 
 | 
| 
 | 
    19         # function
 | 
| 
 | 
    20         self.func = arg if not args else None
 | 
| 
 | 
    21     def __call__(self, *args, **kwargs):
 | 
| 
 | 
    22         if self.func is None:
 | 
| 
 | 
    23             raise NotImplementedError
 | 
| 
 | 
    24         else:
 | 
| 
 | 
    25             if len(args) and isinstance(args[0], string):
 | 
| 
 | 
    26                 args = list(args)
 | 
| 
 | 
    27                 with file(args[0], 'w') as fp:
 | 
| 
 | 
    28                     args[0] =fp
 | 
| 
 | 
    29                     return self.func(*args, **kwargs)
 | 
| 
 | 
    30             return self.func(*args, **kwargs)
 | 
| 
 | 
    31 
 | 
| 
 | 
    32 if __name__ == '__main__':
 | 
| 
 | 
    33     # test code
 | 
| 
 | 
    34     import os
 | 
| 
 | 
    35     import tempfile
 | 
| 
 | 
    36 
 | 
| 
 | 
    37     @fileobj
 | 
| 
 | 
    38     def test1(fp):
 | 
| 
 | 
    39         fp.write('foo')
 | 
| 
 | 
    40 
 | 
| 
 | 
    41     filename = tempfile.mktemp()
 | 
| 
 | 
    42     print filename
 | 
| 
 | 
    43     assert not os.path.exists(filename)
 | 
| 
 | 
    44     test1(filename)
 | 
| 
 | 
    45     assert os.path.exists(filename)
 | 
| 
 | 
    46     print file(filename).read()
 |