在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不支持这样的事情。如果是的话,万岁!
答案 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
对象并使用该数字作为度量,并且将数据存储到数据库中。