- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
#!/usr/bin/env python
# encoding: utf-8
import os
import sys
from sets import Set
class OutputSplitter(object):
""" splitter """
def __init__(self, out_splitter):
self.__pipes=None
if isinstance(out_splitter, OutputSplitter):
self.__pipes = Set(out_splitter.pipes)
elif out_splitter:
print out_splitter
if type(out_splitter) == list : #
for pn in out_splitter:
self.add_pipe(pn)
else:
self.add_pipe(out_splitter)
@property
def pipes(self):
return self.__pipes
def add_pipe(self, pn):
if isinstance(pn, basestring):
if pn == 'stderr': x = sys.stderr
elif pn == 'stdout': x = sys.stdout
else:
p = os.path.dirname(pn)
if p and not os.path.exists(p):
os.makedirs(p)
try:
x = open(pn,'w+')
except IOError:
raise
else: x = pn
if hasattr(x, 'write') and hasattr(x, 'flush'):
if self.__pipes is None:
self.__pipes=Set()
self.__pipes.add(x)
def write(self,s):
if self.__pipes:
for p in self.__pipes:
p.write(s)
def flush(self):
if self.__pipes:
for p in self.__pipes:
p.flush()
#def __enter__(self):
# pass
#def __exit__(self, exc_type, exc_value, traceback):
# pass
if __name__ == '__main__':
cout=sys.stdout if True else sys.stderr
o=OutputSplitter(cout)
pass
Испаравленная версия по монивам http://govnokod.ru/17181. Учтены замечания некого Анонимус http://govnokod.ru/17181#comment256577. Надеюсь что будут еще замечания, такие же конструктивные и полезные.
bormand 09.12.2014 07:48 # 0
> if self.__pipes is None:
> if self.__pipes:
Нахуя все эти свистопляски с None? Сунул бы туда пустой Set в конструкторе, да и всё. Кода было бы на порядок меньше. Даже в жабе рекомендуют юзать пустые коллекции вместо null'ов.
apgurman 09.12.2014 08:11 # 0
bormand 09.12.2014 08:15 # +1
apgurman 09.12.2014 08:19 # 0
apgurman 09.12.2014 08:24 # 0
apgurman 09.12.2014 09:23 # 0
Files opened are not closed. In fact, it might be a good idea to open/close file handles using __enter__() and __exit__() methods, which need to be defined for this class.
Что-то у меня никак в переопределенный метод __exit__() управление не передается. Почему?
bormand 09.12.2014 09:30 # 0
bormand 09.12.2014 09:44 # +1
apgurman 09.12.2014 23:44 # 0
bormand 10.12.2014 06:26 # 0
apgurman 10.12.2014 06:42 # 0
bormand 10.12.2014 07:07 # 0
apgurman 10.12.2014 06:49 # 0
bormand 10.12.2014 07:09 # 0
Ну самый тупой вариант - второй Set или list, в который добавлять пайпы, которые OutputSplitter запилил сам и должен закрыть.
> правильных программ и библиотек на Python
Тогда еще придется прочесть PEP-8, работу с pip и о создании пакетов...
apgurman 10.12.2014 07:29 # 0
apgurman 10.12.2014 07:31 # 0
apgurman 10.12.2014 07:34 # 0
bormand 10.12.2014 08:43 # +1
Сделай еще метод close() своему OutputSplitter'у, чтобы можно было вручную позакрывать, без with. А из __exit__ его вызовешь.
apgurman 11.12.2014 21:52 # 0
guest 12.12.2014 06:55 # 0
bormand 12.12.2014 07:11 # 0
guest 09.12.2014 22:00 # +1
Xom94ok 09.12.2014 22:44 # 0
guest 09.12.2014 22:53 # 0
Предпоследний пост. Читай очень внимательно.
guest 11.12.2014 08:36 # +1
guest 11.12.2014 08:36 # +1
Vasiliy 12.12.2014 17:09 # +2
bormand 12.12.2014 18:14 # 0