LINUX.ORG.RU

python, как выводить на экран свойства в том порядке, в котором они определены?

 ,


0

1

Приветствую, есть ситуация, пример:

class Line:
    def __init__(self):
        self.properties = {"x1":0, "y1":0, "x2":0, "y2":0, "thickness":1, "color":"#ff0000"}

# далее где-нибудь в коде:
for p in self.properties:
    print(p)

'''
на выходе имеем нечто типа:
y2
color
thickness
x2
y1
x1
'''

Что явно не доставляет, нужен вывод в том же порядке, в котором он определён(x1, y1, x2, y2...), возможно ли, как?

★★★★★

У вас неподходящая структура данных.

1. Замени а список туплов [('x1', 0),('y1', 0)] 2. from collections import OrderedDict

voskhod
()

По-моему выше верно заметили порядок словарем не сохраняется, во всяком случае обычным, но есть OrderedDict

pylin ★★★★★
()
Ответ на: комментарий от vurdalak

Формально, для работы хватает и обычного dict-a .проблема в том, что он пишется в файл(xml), и там хорошо бы видеть тот порядок, в котором оно определено. На работоспособность это не влияет, но как-то коряво смотрится.

xterro ★★★★★
() автор топика
Ответ на: комментарий от voskhod

тогда по идее у меня должна быть примерно такая структура, иначе как сортировать при выводе?

[({"x1": 100}, 1), ({"y1":100}, 2), ({"x2":150}, 3), ({"y2":300}, 4)...]
xterro ★★★★★
() автор топика

Если ордеред расово не верен, то можно рядом кинуть массив из одних имен и выводить, бегая по нему, например.

arturpub ★★
()

Формально, для работы хватает и обычного dict-a

Это какое-то уг, а не работа. Зачем кладёшь свойства в отдельный словарь когда на самом деле их нужно положить в члены самого класса Line?

хорошо бы видеть тот порядок, в котором оно определено
Наверняка не в каком определено, а в строго заданном. Итого, если всё сделать «правильно», то должно получиться как-то так
class Line:
    def __init__(self):
        self.x1         = 0
        self.y1         = 0 
        self.x2         = 0
        self.y2         = 0 
        self.thickness  = 1,
        self.color      ="#ff0000"


for name in ('x1', 'y1', 'x2', 'y2', 'thickness', 'color'):
	print getattr(self, name)

mashina ★★★★★
()
Ответ на: комментарий от mashina

Так удобней было заполнять список объектов при загрузке из xml файла. в принципе в данном случае можно переделать с использованием getattr, но список названий реквизитов всё равно придётся хранить списком, или можно как-то получить список реквизитов объекта?.

def load_from_xml_string(self, xml_str):
        root = ET.fromstring(xml_str)
        if(root.tag.lower() == "symbol"):
            self.category = root.attrib["category"]
            self.name = root.attrib["name"]
            for child in root:
                p = child.tag.lower()
                if(p in self.primitive_types):
                    primitive = self._create_primitive(p)
                    self._fill_primitive_from_node(primitive, child)
                    self.primitive_list.append(primitive)
                    
                
    def _create_primitive(self, ptype):
        if(ptype in self.primitive_types):
            if(ptype.lower() == "line"):
                return PLine()
            elif(ptype.lower() == "rect"):
                return PRect()
            elif(ptype.lower() == "arc"):
                return PArc()
            elif(ptype.lower() == "circle"):
                return PCircle()
            elif(ptype.lower() == "text"):
                return PText()
            elif(ptype.lower() == "polygon"):
                return PPolygon()
        else:
            return None
            
    def _fill_primitive_from_node(self, object, node):
        if(node != None):
            for p in object.properties:
                try:
                    object.properties[p] = node.attrib[p]
                except:
                    print("Warning: There is no attribute with name: '" + str(p) + "' for object: " + str(object) +" in xml string!")
                    object.properties[p] = None
xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

но список названий реквизитов всё равно придётся хранить списком

Если он упорядочненный, то да, придётся. Вопрос же как именно это придётся делать. OrderedDict и просто dict() в виде properties это костыльно и неудобно ддя каких-либо дальнейших изменений кода. Нужно как-то так

class Primitive(object):
    "Primitive interface"
    PROPS = tuple() # fill with props literals

class Line(Primitive):
    PROPS = ('x1', 'y1', 'x2', 'y2', 'thickness', 'color')

    def __init__(self):
        self.x1         = 0
        self.y1         = 0 
        self.x2         = 0
        self.y2         = 0 
        self.thickness  = 1,
        self.color      ="#ff0000"

for name in Line.PROPS:
	print getattr(self, name)
Здесь удобно работать с самим примитивом прямо через члены объекта и удобно расширять код. Например, если понадобится потом валидировать свойства на корректность, то будет как-то так
class Line(Primitive):
    PROPS = (Meta('x1', int), ..., Meta('color', Color))

# ...

for meta in Line.PROPS:
	print meta.to_str(getattr(self, meta.__name__()))

mashina ★★★★★
()

Сделай сразу на Руби и не мучайся, там вменяемые хэши по дефолту.

anonymous
()
Ответ на: комментарий от mashina

Зачем кладёшь свойства в отдельный словарь когда на самом деле их нужно положить в члены самого класса Line?

И итерировать каждый раз в явном виде? без keys() и values()?

alpha ★★★★★
()
Ответ на: комментарий от alpha

И итерировать каждый раз в явном виде? без keys() и values()?

Где, каждый раз? Пока там видно только одно место итериования, это сохранение, в остальном итерирование не очень нужно. И что подразумеваешь под 'в явном виде'?

mashina ★★★★★
()
Ответ на: комментарий от z00ke

Иди на php сайты за еду пиши, быдлокодер.

Делать больше нечего, как отнимать хлеб у убогих вроде тебя.

mashina ★★★★★
()
Ответ на: комментарий от alpha

Просто мне лень заглянуть в документацию, но по-моему у класса можно получить свойства как словарь, может я ошибаюсь.

pylin ★★★★★
()

в аналогичной ситуации сортировал свойства в алфавитном порядке при записи в файл

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

только мне оно правда нужно было (свойств очень много было), а тебе проще сделать по-нормальному

ei-grad ★★★★★
()
Ответ на: комментарий от pylin

Так топик же о сохранении порядка. А свойства получишь как обычный словарь.

x3al ★★★★★
()
Ответ на: комментарий от ei-grad
class PLine(...):
    def __init__(self, x1, x2, y1, y2, thickness, color):
        self.x1 = x1
        ...

    def get_xml(self):
        e = Element('line')
        e.set('x1', self.x1)
        ...
        return e
ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 2)
Ответ на: комментарий от alpha

Там видно многоточие.

Просто другой код. Упорядоченый обход (как и вообще обход) нужен только для сериализации

проблема в том, что он пишется в файл(xml), и там хорошо бы видеть тот порядок

т.е. фактически всё будет в одном месте и один раз. Но в его случае явного обхода всё равно не будет из-за наличия разных примитивов, обход будет по ключам из Primitive.PROPS

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.