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

    −96

    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
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    import os
    import codecs
    from xml.dom import minidom
    
    dir = 'C:\\Users\\pee\\AppData\\Roaming\\Thunderbird\\Profiles\\your_profile_here.default\\extensions'
    target = 'install.rdf'
    TB_id = '{3550f703-e582-4d05-9a08-453d09bdfdc6}'
    maxVer = '5.*'
    
    # open file, parse xml, find Thunderbird ID, change maxVersion, save file
    def verchanger(rdf):
        found = False
        print(rdf)
        xmldoc = minidom.parse(rdf)
        idlist = xmldoc.getElementsByTagName("em:id")
        for i in idlist:
            if i._get_firstChild().nodeValue == TB_id:
                print('Thunderbird ID was founded in em:id node with index ', idlist.index(i)+1)
                print(i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue)
                if i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue == maxVer:
                    print('file already updated, skipping')
                    break
                else:
                    found = True
                    i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue = maxVer
                print('new value is: ', i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue )
        if found:
            xmldoc.writexml(codecs.open(rdf,'w','utf-8'), encoding='utf-8')
    
    
    # get list of files with full paths
    filelist = [dir + '\\' + x + '\\' + target for x in os.listdir(dir)]
    
    for i in filelist:
        verchanger(i)

    Мой первый говнокод :)

    Проходит по папке с расширениями Thunderbird, изменяя требуемую минимальную версию плагина на железно заданную maxVer. Вынужденно наговнокодено после обновления ТБ на версию 5.

    Прошу разобрать по косточкам, я Питон только изучаю. Дочитал Лутца до классов, почти всё накопал с помощью Гугля .

    Запостил: omgiafs, 05 Июля 2011

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

    • > Прошу разобрать по косточкам, я Питон только изучаю

      АЦИНИТИ КООТ!!!

      вообще-то, предполагается, что автор понимает, в чем говно.
      и что это не лаба.
      Ответить
    • > from xml.dom import minidom
      я все жду, когда копирайт доберется и до Document Object Model, и появится ццшная имплементация freedom :)
      Ответить
    • Здесь не клуб помощи начинающим кодерам, но так уж и быть. По верхам.

      За Python 3 — хвалю. ;)

      Захардкоженные виндовые пути можно указывать как raw strings: r'C:\Users\pee\...'. А можно и прямые слеши вместо обратных использовать, винда не обидится.

      Для построения пути следует использовать не конкатенацию с '\\', а os.path.join.

      _get_firstChild — приватный метод, деталь реализации. Он доступен, но использование его считается плохим тоном. Следует использовать firstChild. На самом деле тут могут быть подводные камни.

      Вместо idlist.index(i) следует использовать итерацию по enumerate или по индексу.

      Вместо codecs.open можно использовать просто open и указывать encoding именованным параметром.

      i.parentNode.getElementsByTagName("em:ma xVersion")[0] можно выделить в отдельную переменную.

      Вместо громоздкого xml.dom.minidom лучше использовать xml.etree.ElementTree.
      Ответить
      • > но так уж и быть
        не прикармливай
        Ответить
      • Благодарю за комментарий, всё понял, следующий говнокод будет осмысленным, исключительно поржать.
        Ответить
      • А слона то и пропустили. я не большой питоновед, но идеи везде одинаковые:
        1. Хардкод в топку. Даёшь аргументы командной строки.
        2. Функции длиннее 5 строк навевают унылые мысли.
        3. Основная ошибка всех новичков (да и не только новичков) - в одном блоке кода перемешивается несколько уровней абстракции.
        Ответить
        • Для одноразового (практически) скрипта это всё не нужно. Понадобиться изменить параметры — проще подредактировать скрипт, чем вспоминать, с какими аргументами должен он запускаться.
          Ответить
          • Человек же учится, а не пишет одноразовый скрипт ) Когда учишься, лучше использовать хорошие практики даже в малом. Точнее, лучше использовать хорошие практики в проектах любого масштаба.
            Ответить
            • Как лучше использовать каждые полтора месяца скрипт, как
              fix-thunderbird C:\Users\pee\AppData\Roaming\Thunderbird\Profiles\your_profile_here.default\extensions install.rdf {3550f703-e582-4d05-9a08-453d09bdfdc6} 5.*
              или просто
              fix-thunderbird
              ?

              В этом и состоит отличие скриптов, что в них внутри записаны параметры, которые проще изменить (если понадобится), отредактировав скрипт, чем вводить вручную каждый раз при запуске. Так что всё правильно сделал.
              Ответить
              • О как вы меня-то теперь прикормили;)

                Лучше использовать с параметром и его значением по умолчанию, причем значение должно браться так: os.path.expanduser('~/AppData/Roaming/Thunderbird/Profiles')

                а оттуда с помощью configparser из profiles.ini путь к дефолтному профилю.

                по умолчанию программа должна думать сама.
                Ответить
                • Это не программа, а (почти) одноразовый скрипт. Вы скрипты для автоматизации своих действий когда-нибудь писали?

                  Если уж делать автоопределение параметров и разбор командной строки, то следует ещё выделить отдельный модуль, написать документацию, маны, создать README, INSTALL, COPYING, AUTHORS, THANKS, ChangeLog, NEWS, TODO и запакетироать для дистрибьюции. Давайте, вперёд, не буду отговаривать.
                  Ответить
                  • не несите чушь.

                    скрипты пишут на bash, а на python пишут программы. я писал на питоне программы для автоматизации своих действий и прекрасно всегда пользовался батарейками для парсинга аргументов и вычисления нужных мне умолчаний.

                    вы виндовые свои привычки выкинули бы и начинали бы уже линуксом пользоваться, как нормальный человек, может быть тогда и говно перестали бы писать.
                    Ответить
          • "import argparse" ?
            Ответить
            • ImportError: No module named argparse

              Эту батарейку очень недавно стали включать. И чем оно поможет?
              Ответить
              • ну, для прокаженных без 2.7 есть optparse.

                а поможет оно чтобы не вспоминать а набрать script.py -h и увидеть все его возможные параметры
                Ответить
    • govnokod.ru != pastebin.com
      Ответить
    • >мой первый говнокод
      С прибытием в гвардию говнокодеров
      Ответить
    • >C:\\Users\\pee\\
      Ц:\Пользователи\ссать
      Ответить

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