0

在 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 是否有任何内置的方法可以做到这一点。一个很好的解决方案将向我展示一种在 Python 2.7return中打印的字符串的方法。print(类似于print_rPHP 中的东西,否则我觉得它完全不如 Python。)我计划以编程方式对许多具有预填充变量的对象进行此操作,因此不要写入临时文件或类似的东西。

谢谢!

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

4

5 回答 5

1

首先,sys.getsizeof()不是用来确定打印尺寸的方法。对于将 python 对象表示为字符串所需的字符数,python 对象内存占用量是一个很差的指标。

你正在寻找len()。使用一个简单的生成器表达式 plussum()来获得总数:

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
于 2013-08-13T09:27:32.660 回答
1

现在应该正确执行此操作:

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

对于不支持该str(obj)功能的对象。您可以将 替换为str自制函数或 lambda:

def printlen(*args):
    return sum(map(len, map(lambda x: str(x) if hasattr(x, '__str__') else '', args)))
于 2013-08-13T09:34:49.790 回答
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)
于 2013-08-29T05:38:05.517 回答
0

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

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

用法:

printlen(obj1, obj2, ..)
于 2013-08-13T10:09:40.750 回答
0

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

于 2013-08-13T11:07:38.563 回答