Надеюсь, я понимаю, что вы ищете: какой-нибудь способ удобно идентифицировать каждую часть строки с помощью простой переменной, но вывести ее с отступом до правильной ширины?
Фрагмент ниже может дать вам то, что вы хотите
class FixWidthFieldLine(object):
fields = (('foo', 10),
('bar', 30),
('ooga', 30),
('booga', 10))
def __init__(self):
self.foo = ''
self.bar = ''
self.ooga = ''
self.booga = ''
def __str__(self):
return ''.join([getattr(self, field_name).ljust(width)
for field_name, width in self.fields])
f = FixWidthFieldLine()
f.foo = 'hi'
f.bar = 'joe'
f.ooga = 'howya'
f.booga = 'doin?'
print f
Это дает:
hi joe howya doing
Он работает путем хранения переменной уровня класса, fields
, которая записывает порядок, в котором каждое поле должно появляться в выходных данных, вместе с количеством столбцов, которое должно иметь это поле. В __init__
есть соответственно именованные переменные экземпляра, которые изначально установлены в пустую строку.
Метод __str__
выводит эти значения в виде строки. Он использует понимание списка по атрибуту fields
уровня класса, просматривая значение экземпляра для каждого поля по имени, а затем выравнивая его по левому краю в соответствии со столбцами. Полученный список полей затем объединяется пустой строкой.
Обратите внимание, что это не анализирует ввод, хотя вы могли бы легко переопределить конструктор, чтобы взять строку и проанализировать столбцы в соответствии с полем и шириной поля в fields
. Он также не проверяет значения экземпляров, длина которых превышает их выделенную ширину.