1. Python / Говнокод #4910

    −179

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    class Source:
    		id = ''
    		values = []
    		arrays =[ ( 'bool_array', bool), ( 'float_array', float), ('IDREF_array', str), ('int_array', int), ('Name_array', str), ('SIDREF_array', str), ('token_array', str)]
    		
    		def __init__(self, node):
    			self.id = node.getAttribute('id')
    			
    			accessors = dict([ (accessor.getAttribute('source')[1:], (int(accessor.getAttribute('count')), int(accessor.getAttribute('stride'))) ) for technique in node.getElementsByTagName("technique_common") for accessor in technique.getElementsByTagName("accessor") ])
    			values = [(arrayNode.getAttribute('id'), int(arrayNode.getAttribute('count')), [array[1](v) for v in getText(arrayNode).split()]) for array in Mesh.Source.arrays for arrayNode in node.getElementsByTagName(array[0])]
    			self.values = [ array[2][i*accessors[array[0]][1]:(i+1)*accessors[array[0]][1]] for array in values for i in range(accessors[array[0]][0])]
    			
    
            <source id="Box001-lib-Position">
              <float_array id="Box001-lib-Position-array" count="24">-23.296745 -46.390999 0.000000 23.296745 -46.390999 0.000000 -23.296745 46.390999 0.000000 23.296745 46.390999 0.000000 -23.296745 -46.390999 35.287621 23.296745 -46.390999 35.287621 -23.296745 46.390999 35.287621 23.296745 46.390999 35.287621</float_array>
              <technique_common>
                <accessor source="#Box001-lib-Position-array" count="8" stride="3">
                  <param name="X" type="float"/>
                  <param name="Y" type="float"/>
                  <param name="Z" type="float"/>
                </accessor>
              </technique_common>
            </source>
    
    в результате нужно получить список в виде
    [[-23.296745, -46.390999, 0.0], [23.296745, -46.390999, 0.0], [-23.296745, 46.390999, 0.0], [23.296745, 46.390999, 0.0], [-23.296745, -46.390999, 35.287621], [23.296745, -46.390999, 35.287621], [-23.296745, 46.390999, 35.287621], [23.296745, 46.390999, 35.287621]]

    Неделю назад начал учить питон, и для того чтоб это было совсем полезно, решил попробовать написать на нем парсер Collada файлов.
    Очень сильно проникся идеей инициализации массивов, из-за чего и родился сей говнокод...
    Код выдает правильный результат, но абсолютно не читаемый...

    Запостил: pushkoff, 13 Декабря 2010

    Комментарии (21) RSS

    • Ну и? Отрефакторить и переформатировать – будет хорошо.
      Ответить
      • непоможет, надо переделывать... так как array может быть получен из другого файла, а у меня тут только локально... да и array по стандарту может быть только 1 как и accessor...
        Ответить
        • >Неделю назад начал учить питон

          пушкофф, ах ты пиздливчик!! думаешь, никто не помнит, как ты усерался, что все свои скрипты на пистоне пишешь? как некрасиво..
          Ответить
          • да, но это очень простые скрипты, там важнее правильно описать классы чем код, так как по описаниям классов генерится код на С++ и код для загрузки из блобов. сейчас я решил основательно разобраться в парсинге хмл и выводе бинарных данных с определенной структурой (меши, текстуры, материалы)
            Ответить
    • на пистоне уже относительно давно существуют библиотеки комбинаторного парсинга (да-да, это содрано с parsec).
      и уж не не знаю сколько тысяч готовых xml-парсеров.
      Ответить
      • я использую minidom, скорость еще не тестил, так как сейчас все упирается в вывод дебаг инфы на экран...
        и еще не читал, годен ли такой метод для заполнения массивов...
        Ответить
        • >python
          >скорость
          хм, как бы помягче сказать...

          >дебаг инфы на экран
          это ГК или школьник.ру?
          Ответить
          • ну не верю я, что все методы одинаково равны...
            Ответить
          • >дебаг инфы на экран
            "echo -- лучший дебаг" (С) пыхапешники
            Ответить
          • я знал что будет медленно, но не на столько...
            модель в 2760 полигонов (что мало) преобразовывается в набор вершин и индексов где-то за 3-4 минуты и это без каких-то особых математических преобразований... я в печали, так как файлы покрупнее (в 20 раз крупнее) преобразовываются за считанные секунды нативным экспортером. но хочу попробовать по оптимизировать, может и из питона можно выжать хоть какие-то более вменяемые цифры...
            Ответить
    • если для self.values делать += то изменяется Source.values, так и должно быть или я делаю что-то не так?
      Ответить
    • попробуйте
      from lxml import etree
      и после почитайте про xpath http://ru.wikipedia.org/wiki/XPath
      с ним гораздо удобнее работать с xml. красивше:
      fifos = etree.XML('''xml text here''')
      fifos.xpath('/fifo_report/fifo[@name="operators"]/callers/caller[@status="TALKING"]')
      получаю всех callers со атрибутом status = TALKING из fifo с атрибутом name = operators
      Ответить
    • Я думаю, что Вы ошибаетесь. Давайте обсудим это. Пишите мне в PM, пообщаемся.


      ------
      <a href=http://pogoda5day.ru/>погода сейчас</a> | http://pogoda5day.ru/
      Ответить
    • In it something is. Clearly, thanks for an explanation.


      -----
      yacht charter barcelona <a href=http://european-yachts.com/en/rent-yachts-spain>go to site</a>
      Ответить
    • Излечение достаточно редких хвори, детальное исследование, рецензии от профессиональных ассистентов поджидает пациентов в знаменитой больнице Топ Ассута, какова указана наилучшей в Израиле, и расположена у Тель -Авиве. Центр Топ Ассута предлагает физиотерапию разных простуд однозначно доступней, нежели другие страны ЕС, также указывает главные практику медицины в области связь с дерматологом, метастазы, формирование формы обличия , ортопраксия, кровообращение, глазные врачи также иных хвори. Холдинг <a href=http://israel-hospital.com/sosudistaya-hirurgiya-v-izraile/>лечение тромбоза в израиле</a> долгое время работает с достопримечательными клиническими учреждениями столицы безусловно содействует быстро и доброкачественно выбрать определенно Вас проверенный отделение за доступные стоимость к промышляющем клинике. Компания показывает именно для персональных потребителей хороший направление учреждений в страны Израиль, идеже пациент имеет возможность оздоровиться также передохнуть совокупно.
      Ответить

    Добавить комментарий