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

    −93

    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
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    # Source: python3.4/distutils/dir_util.py
    
    
    # cache for by mkpath() -- in addition to cheapening redundant calls,
    # eliminates redundant "creating /foo/bar/baz" messages in dry-run mode
    _path_created = {}
    
    # I don't use os.makedirs because a) it's new to Python 1.5.2, and
    # b) it blows up if the directory already exists (I want to silently
    # succeed in that case).
    def mkpath(name, mode=0777, verbose=1, dry_run=0):
        """Create a directory and any missing ancestor directories.
    
        If the directory already exists (or if 'name' is the empty string, which
        means the current directory, which of course exists), then do nothing.
        Raise DistutilsFileError if unable to create some directory along the way
        (eg. some sub-path exists, but is a file rather than a directory).
        If 'verbose' is true, print a one-line summary of each mkdir to stdout.
        Return the list of directories actually created.
        """
    
        global _path_created
    
        # Detect a common bug -- name is None
        if not isinstance(name, basestring):
            raise DistutilsInternalError, \
                  "mkpath: 'name' must be a string (got %r)" % (name,)
    
        # XXX what's the better way to handle verbosity? print as we create
        # each directory in the path (the current behaviour), or only announce
        # the creation of the whole path? (quite easy to do the latter since
        # we're not using a recursive algorithm)
    
        name = os.path.normpath(name)
        created_dirs = [] 
        if os.path.isdir(name) or name == '':
            return created_dirs
        if _path_created.get(os.path.abspath(name)):
            return created_dirs
        ...

    Мало того, что метод жив на основании того, что os.makedirs был добавлен только в Python 1.5.2 (мама родная, 2.7 скоро закопаем, а говно всё тянется), так его ещё и умудрились наиндусить на 60 строк кода, да ещё и ХХХ секцию аккуратно положили. Ладно, чего это я придираюсь... Ах да, оно кеширует уже созданные директории, так что если создать папку и удалить её, второй раз её уже никак не создашь...

    Запостил: frol, 23 Октября 2014

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

    • Вполне возможно, что метод написали в районе 1.5-1.6. И с тех пор следовали заповеди "работает - не трогай".
      Ответить
    • > r14970 | gward | 2000-04-04 09:05:59 +0700 (Вт., 04 апр. 2000) | 8 lines
      > Reorganization: ripped util.py to shreds, creating in the process:
      > - file_util.py: operations on single files
      > - dir_util.py: operations on whole directories or directory trees
      > - dep_util.py: simple timestamp-based dependency analysis
      > - archive_util.py: creation of archive (tar, zip, ...) file
      14 лет назад этот dir_util.py родился из util.py... Это была версия питона 1.6.
      Ответить
      • День рождения функции мы так и не узнаем, т.к. первый коммит в distutils был в 99 году:
        r12938 | gward | 1999-03-22 21:52:19 +0700 (Пн., 22 марта 1999) | 2 lines

        First checkin of real Distutils code.


        А вот тот самый кеш и мнение автора о нём:
        r13845 | gward | 1999-09-22 01:37:51 +0700 (Ср., 22 сент. 1999) | 6 lines
        Added 'write_file()' function.
        Added global cache PATH_CREATED used by 'mkpath()' to ensure it doesn't
        try to create the same path more than once in a session (and, more
        importantly, to ensure that it doesn't print "creating X" more than
        once for each X per session!
        ).
        Ответить

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