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

    −120

    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
    class Node:
        def __init__(self):
            pass
    
        def __str__(self):
            return self.prn()
    
        def prn(self):
            ret = ''
            if hasattr(self, 'field_list'): # struct
                ret += 'struct ' + self.id + '{\n'
                for fld in self.field_list:
                    ret += '\t' + str(fld) + '\n'
                ret += '\n}\n'
            elif hasattr(self, 'type'): # field list of single type
                fld_str_l = []
                for f in self.fields:
                    fld_str_l += [str(f)]
                ret += self.type + '\t' + ', '.join(fld_str_l) + ';'
            elif hasattr(self, 'sizes'): # variable (maybe array)
                ret += self.id
                for s in self.sizes:
                    ret += '[' + s + ']'
            return ret

    Фрагмент парсера сишных структур для последующей генерации (де)сериализатора.
    Не заходит что-то в у меня питон.

    Запостил: Xom94ok, 16 Февраля 2015

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

    • hasattr(self - такое недоверие к самому себе... намекает на то, что это скорее всего были методы классов-наследников? Если да, то есть такое же ощение, что и обработку надо было в наследниках писать.
      И вообще, зачем заниматься такой ерундой, когда есть Cython?
      Ответить
      • Наследников нет, дерево состоит исключительно из Node; hasattr для полиморфизма. Всё очень плохо, но оно работает :)
        > Cython
        А он умеет по грамматике строить лексер-парсер? Меня гугол первыми ссылками привел к python lexx-yacc, с которым я за пару часов сотворил что-то рабочее.
        Ответить
        • Cython это вариант Питона, который транслирует код на Питоне в Си. Т.е. не нужно писать парсеры и т.п. парсер самого Цытона это сам сделает. Ту же структуру, которая тут генерируется, можно было бы описать так:
          http://docs.cython.org/src/userguide/language_basics.html


          Ну это гнилой такой полиморфизм, когда он весь внутри одной функции, то это... мнимый полиморфизм :)
          Ответить
    • Есть же модуль struct.
      Ответить

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