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で出力される文字列への道を示してくれるでしょう。printprint_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を自作の関数またはラムダに置き換えることができます。

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 が出力する文字列を返す方法を教えてくれるでしょう。」

これは大まかに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 に答える