扩展print语句/函数的功能

时间:2014-08-30 20:21:00

标签: python python-2.7 python-3.x decorator

我希望使用[]方法而不是{{1}打印容器(例如打印容器({}()str())。 }。编写一个能够做到这一点的函数

是微不足道的
repr()

但如果我可以扩展或修饰print statementprint() function(在Python 2.7中),它会非常好用

我可以做类似这样的事情,它可以在python 3中运行(在{3.2}中的{3.2}中测试)

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

这给了我一个输出

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()])

但在

的python 2.7.6中给出了语法错误
[Repr]
[String]

直到我导入

print = my_decorator(print)

这是有道理的,因为语句不能(据我所知)被装饰或重新分配。

所以我的问题是

  1. 是否可以装饰打印声明,因此我不必导入该功能?
  2. 这是一个好主意,还是我应该更明确地使用我的from __future__ import print_function 功能?在这种情况下,我知道一个事实,这将是我个人使用,主要用于调试

1 个答案:

答案 0 :(得分:3)

  1. 不,声明无法更改。
  2. 否。处理此问题的方法是创建自己的list并传递它 - 这正是继承所做的。
  3. 像这样:

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