2015-05-15 4 views
2

Я использую ниже код, чтобы добавить метку в печать. но странно, почему он добавляет две метки времени вокруг сообщения.Почему это добавляет дополнительную метку времени при печати?

old_f = sys.stdout 

class CFout: 
    def write(self, x): 
     old_f.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x)) 

sys.stdout = CFout() 

Когда я print True. он выводится, как показано ниже.

15/05/2015 05:42:02:121945 True 15/05/2015 05:42:02:121977 

До и после True, есть две метки времени.
Почему это? Я хочу добавить только метку времени до True.

+1

Вы должны использовать '' logging'' для выполнения этой задачи: https://docs.python.org/2/library/logging.html – klashxx

ответ

3

Это связанно с тем, что print оператор или функция выполняет два вызовов на write, один для печати сообщения ('True') и один для заканчивающегося новой строки или пространства.

Вы можете увидеть это с помощью сценария, как следующее:

import sys 
from datetime import datetime 

args = [] 

class CFout: 
    def write(self, x): 
     args.append(x) 
     sys.__stdout__.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x)) 


sys.stdout = CFout() 

print True 
print False 
print 1, 2, 3 

sys.stdout = sys.__stdout__ 
print 'arguments were' 
print args 

Названные результаты в:

$python2 prnt.py 
15/05/2015 08:07:03:171182 True 15/05/2015 08:07:03:171392 
15/05/2015 08:07:03:171452 False 15/05/2015 08:07:03:171477 
15/05/2015 08:07:03:171517 1 15/05/2015 08:07:03:171540 15/05/2015 08:07:03:171561 2 15/05/2015 08:07:03:171581 15/05/2015 08:07:03:171601 3 15/05/2015 08:07:03:171621 
arguments were 
['True', '\n', 'False', '\n', '1', ' ', '2', ' ', '3', '\n'] 

Примечание:

  • 'True' и '\n' аргументы для двух звонки, выполняемые при выполнении print True.
  • 'False' и '\n' аргументы для двух вызовов, выполняемых при выполнении print False
  • '1', ' ', '2', ' ', '3' и '\n' аргументы, выполняемые при выполнении print 1,2,3.

Другой способ увидеть это с помощью исключения:

>>> print 1, 1/0, 2 
1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

Примечания: 1 еще печататься, даже несмотря на то, 1/0 вызывает исключение. Что делает python, он берет каждую отдельную часть материала для печати, оценивая его, а затем вызывает write. Затем он вызывает write(' '), чтобы распечатать пробел из-за запятой и, наконец, оценивает 1/0, что приводит к исключению.

Таким же образом print True сначала вычисляет True, затем вызывает write(str(True)) и, наконец, вызывает write('\n') добавить окончательный символ новой строки.

Если вы хотите использовать проприетарную метку для сообщений, вы должны использовать модуль logging.

0

База на @Bakuriu Ответ, я использую ниже код для достижения своего объекта, поскольку я уверен, что не буду использовать «\ n» в сообщении для печати. :). Я публикую здесь, если другие тоже интересны.

old_f = sys.stdout 
class CFout: 
    def write(self, x): 
     if x.find("\n") == -1: 
      old_f.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x)) 
     else: 
      old_f.write(x) 
sys.stdout = CFout() 
Смежные вопросы