Python打印长度或一次获取多个变量的大小

时间:2013-08-13 09:24:38

标签: python class python-2.7 printing size

在Python中,如果我用逗号分隔的print个不同数据类型,它们将根据它们的__str__(或可能__repr__)方法执行操作,并打印出漂亮的漂亮字符串为了我。

下面有一些像data1, data2...这样的变量,我很想得到它们的总大小。我知道:

  • 并非所有变量都有用sys.getsizeof(我想知道存储的大小,而不是容器的大小。) - 感谢Martijn Pieters

  • 为了我的目的,每个打印变量的长度是足够好的大小估计

我想避免单独处理不同的数据类型。有没有办法利用像print这样的函数来获取数据的总长度?我发现这样的东西不太可能已经内置到Python中了。

>>> obj.data1 = [1, 2, 3, 4, 5]
>>> obj.data2 = {'a': 1, 'b':2, 'c':3}
>>> obj.data3 = u'have you seen my crossbow?'
>>> obj.data4 = 'trapped on the surface of a sphere'
>>> obj.data5 = 42
>>> obj.data6 = <fake a.b instance at 0x88888>
>>> print obj.data1, obj.data2, obj.data3, obj.data4, obj.data5, obj.data6
[1, 2, 3, 4, 5] {'a': 1, 'c': 3, 'b': 2} have you seen my crossbow? trapped on the surface of a sphere 42 meh

我正在寻找类似的东西:

printlen(obj.data1, obj.data2, obj.data3, obj.data4, obj.data5, obj.data6)
109

我知道大多数人都可以写这样的东西,但我大多问的是Python是否有任何内置方法可以做到这一点。一个很好的解决方案将向我展示return print在Python 2.7中打印的字符串的方法。 (像PHP中的print_r,我觉得它完全不如Python。)我打算用许多具有预填充变量的对象进行编程,所以不要写入临时文件或类似的东西这一点。

谢谢!

作为旁注,这个问题源于需要计算从未知数据构造的类中的变量的近似总大小。如果你有办法获得课堂上不可调用项目的总大小(老实说,总大小也会起作用),那么解决方案会更好。我没有把它作为我的主要问题,因为它看起来像Python不支持这样的事情。如果是的话,万岁!

5 个答案:

答案 0 :(得分:1)

首先,sys.getsizeof() 用于确定打印尺寸的方法。 python对象内存足迹是表示将python对象表示为字符串所需的字符数的不良指标。

您正在寻找len()。使用简单的生成器表达式和sum()来获得总计:

def printlen(*args):
    if not args:
        return 0
    return sum(len(str(arg)) for arg in args) + len(args) - 1

表达式之间的逗号告诉print打印一个空格,因此写入print的总长度stdout是所有字符串表示的总和,加上元素之间的空格

我假设您不希望也包含换行符print

演示:

>>> printlen(data1, data2, data3, data4, data5, data6)
136

答案 1 :(得分:1)

现在应该这样做了:

def printlen(*args):
    return sum(map(len, map(str, args)))

对于不支持str(obj)功能的对象。您可以使用自制函数或lambda:

替换str
def printlen(*args):
    return sum(map(len, map(lambda x: str(x) if hasattr(x, '__str__') else '', args)))

答案 2 :(得分:1)

“一个很好的解决方案会告诉我一种方法来返回在Python 2.7中打印打印的字符串。”

这大致是print打印的内容(可能是额外的空格,缺少最终换行符):

  def print_r(*args):
      return " ".join((str(arg) for arg in args))

如果您遇到许多不是str的对象 - 可以改为使用safer_str

  def safer_str(obj):
      return str(obj) if hasattr(obj,"__str__") else repr(obj)

答案 3 :(得分:0)

如果你想要长度,你可以使用它:

printlen = lambda *x: print(sum(len(str(i)) for i in x))

用法:

printlen(obj1, obj2, ..)

答案 4 :(得分:0)

如果你有一个对象结构,并且想知道存储它需要多少,你也可以pickle / cpickle对象并使用该数字作为度量,并且将数据存储到数据库中。