2014-08-30 3 views
1

Я хочу напечатать вещи определенной спецификации, такие как печать контейнеры ([], {}, ()), используя свой метод str() вместо repr(). Это тривиально, чтобы написать функцию, которая будет делать этоРасширить функциональность оператора печати/функции

def str_print_list(alist): 
    print "["+", ".join(map(str, alist))+"]" 

но было бы очень хорошо, если бы я мог бы просто расширить или украсить либо print statement или print() function (в Python 2.7)

Я мог бы сделать что-то вроде этого, который работает в Python 3 (протестировано в Python 3.2.3 в http://www.compileonline.com/execute_python3_online.php)

class foo(): 
    def __str__(self): 
     return "String" 
    def __repr__(self): 
     return "Repr" 

print([foo()]) 

def my_decorator(func): 
    def inner(alist): 
     if isinstance(alist, list): 
      return func("["+", ".join(map(str, alist))+"]") 
     else: 
      return func(alist) 
    return inner 

print = my_decorator(print) 
print([foo()]) 

который дает мне выход

[Repr] 
[String] 

но дает мне ошибку синтаксиса в Python 2.7.6 на

print = my_decorator(print) 

, пока я не импортировать

from __future__ import print_function 

, который имеет смысл, потому что утверждения не может (насколько я знаю) быть украшен или переназначен.

Так что мой вопрос

  1. Можно украсить заявление для печати, так что я не импортировать функцию?
  2. Это даже хорошая идея, или я должен быть более явным и использовать функцию str_print_list()? В этом случае я знаю за то, что это было бы для моего личного использования и будет использоваться в основном для отладки
+0

В Python 2.x 'print' это не функция, а конструкция языка. Вам нужно выполнить 'from __future__ import print_function' в Python 2.x, чтобы получить функцию' print' в стиле Python 3.x. – isedev

+0

@isedev да, я говорю это в моем вопросе (в сторону дна). Я хотел бы быть ясным, что я прошу о возможности расширения выражения, если это возможно, в противном случае только импортированная функция – Dannnno

+0

ok, позвольте мне сказать иначе: вы не можете украшать утверждения, поэтому вам нужно импортировать эту функцию. – isedev

ответ

3
  1. Нет, заявления не могут быть изменены.
  2. Нет. Способ справиться с этим состоит в том, чтобы сделать свой собственный list и передать его - это именно то, на что сделано наследование.

Как это:

class MyPrintableList(list): 
    def __repr__(self): 
     return "[{}]".format(",".join(self)) 

print MyPrintableList([foo()]) 
Смежные вопросы