2016-10-25 21 views
3

私はPythonプロジェクトで作業しています。文字列のクラスデータの書式設定に役立ついくつかのショートカットを使用したいと考えています。具体的には、'{a}{b}{c}'.format(**vars(self), [strlen, strlen, strlen])のようなものを使用して、表示される各属性の文字列長を指定できるようにしたいと考えています。たとえば:varsまたは__dict__を使用したPython固定幅文字列フォーマット

class Dummy(object): 
    def __init__(self): 
     self.value1 = 'A VALUE' 
     self.value2 = 'ANOTHER VALUE' 
     self.value3 = 'THIRD VALUE' 

    def to_s(self): 
     # want value1 to be 20 chars 
     # value2 to be 8 chars 
     # value3 to be 10 chars 
     # is something similar to this possible 
     return '{value1},{value2},{value3}'.format(**vars(self), [20, 8, 10]) 


    def to_s2(self): 
     # or will I have to reference each explicitly and specify the either padding or slicing? 
     return '{},{},{}'.format(self.value1.ljust(20), self.value2[:8], self.value3[:10]) 

私はそれがロングショットだ知っているが、これらのクラスのカップルは、30または40はattribsを持っており、これはなんとかであれば、それはそんなに簡単に生活になるだろう。

ありがとうございました。

答えて

2

あなたは{}フィールド内の巣{}フィールドはできますが、ネスティング1レベルだけが許可されています。幸いにも、実際には1レベルのネスティングしか必要ありません。 :) Format String Syntaxから

format_specフィールドは その中にネストされた交換用のフィールドをも含めることができます。これらのネストされた置換フィールドには、フィールド名、 変換フラグおよびフォーマット指定が含まれている可能性がありますが、深いネストは許可されていません。 です。 format_spec内の置換フィールドは、format_spec文字列が解釈される前に に置き換えられます。これにより、値の書式設定を動的に指定することができます( )。このような

class Dummy(object): 
    def __init__(self): 
     self.value1 = 'A VALUE' 
     self.value2 = 'ANOTHER VALUE' 
     self.value3 = 'THIRD VALUE' 

    def __str__(self): 
     # want value1 to be 20 chars 
     # value2 to be 8 chars 
     # value3 to be 10 chars 
     return '{value1:{0}},{value2:{1}},{value3:{2}}'.format(*[20, 8, 10], **vars(self)) 

print(Dummy()) 

出力

A VALUE    ,ANOTHER VALUE,THIRD VALUE 
1

何かうまくいくかもしれない:

class Dummy(object): 
    def __init__(self): 
     self.value1 = 'A VALUE' 
     self.value2 = 'ANOTHER VALUE' 
     self.value3 = 'THIRD VALUE' 

    def to_s(self): 
     return '{0.value1:<20},{0.value2:8},{0.value3:10}'.format(self) 

のSe https://docs.python.org/2/library/string.html#formatstringsの書式についての詳細。より長い属性のリストとより動的な書式が必要な場合は、書式文字列を動的に作成することもできます。 (未テスト):

field_formats = [('value1', '<20'), 
        ('value2', '8'), 
        ('value3', '>10')) # etc. 

    def to_s(self): 
     fmt = ','.join('{0.%s:%s}' % fld for fld in field_formats) 
     return fmt.format(self) 
関連する問題