Pythonの標準ライブラリを読む/os.py その1

こんにちは。
会社の先輩から「自分の足場となる言語は、標準ライブラリまで読み込め」という言葉がありました。現在の自分はなんとなくPythonが若干使えるぐらいの気持ちなので、少しでもきれいなプログラムが書けるようにやっていこうと思います。
毎日少しずつ投稿していこうと思います。

import

import abc
import sys, errno
import stat as st

この中で使ったことがあるのはひとつもない。文中で出てきたら潜ろう。

_names = sys.builtin_module_names

早速出てきた。ただlib配下には置かれておらず、どこから読み込んでいるのか不明。とりあえずスルーする。

# Note:  more names are added to __all__ later.
__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
           "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
           "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
           "popen", "extsep"]

__all__ にリストで色々と追加された。どこかで使われるでしょう。

def _exists(name):
    return name in globals()

_exists という関数が定義された。golobals() の中に引数 name があれば true、なければ false を返す関数のように見える。

def _get_exports_list(module):
    try:
        return list(module.__all__)
    except AttributeError:
        return [n for n in dir(module) if n[0] != '_']

_get_exports_list という関数が定義された。引数 module の __all__ を、list にして返す関数。AttributeErrorが発生した場合には、別のものをらしいんだけど、dir が os 内に見当たらないためよくわからない。
そもそもどういうことが起きたらAttributeErrorが発生するのだろう。module.__all__がなかった場合なのかな。

if 'posix' in _names:
    name = 'posix'
    linesep = '\n'
    from posix import *
    try:
        from posix import _exit
        __all__.append('_exit')
    except ImportError:
        pass
    import posixpath as path

    try:
        from posix import _have_functions
    except ImportError:
        pass

    import posix
    __all__.extend(_get_exports_list(posix))
    del posix

elif 'nt' in _names:
    name = 'nt'
    linesep = '\r\n'
    from nt import *
    try:
        from nt import _exit
        __all__.append('_exit')
    except ImportError:
        pass
    import ntpath as path

    import nt
    __all__.extend(_get_exports_list(nt))
    del nt

    try:
        from nt import _have_functions
    except ImportError:
        pass

else:
    raise ImportError('no os specific module found')

初っ端から最初に飛ばした _names が使われている。うーん、sys を探して読んだほうが良さそうだ…。

眠くなってきたので今日はこのあたりで終了。