CPython如何实现os.environ?

发布于 2025-01-17 06:51:11 字数 1329 浏览 3 评论 0原文

我正在查看并注意到它引用了一个变量< code>environ 在其定义之前的方法中:

def _createenviron():
    if name == 'nt':
        # Where Env Var Names Must Be UPPERCASE
        def check_str(value):
            if not isinstance(value, str):
                raise TypeError("str expected, not %s" % type(value).__name__)
            return value
        encode = check_str
        decode = str
        def encodekey(key):
            return encode(key).upper()
        data = {}
        for key, value in environ.items():
            data[encodekey(key)] = value
    else:
        # Where Env Var Names Can Be Mixed Case
        encoding = sys.getfilesystemencoding()
        def encode(value):
            if not isinstance(value, str):
                raise TypeError("str expected, not %s" % type(value).__name__)
            return value.encode(encoding, 'surrogateescape')
        def decode(value):
            return value.decode(encoding, 'surrogateescape')
        encodekey = encode
        data = environ
    return _Environ(data,
        encodekey, decode,
        encode, decode)

# unicode environ
environ = _createenviron()
del _createenviron

那么 environ 如何进行设置呢?我似乎无法推理它的初始化和声明位置,以便 _createenviron 可以使用它?

I was looking through source and noticed that it references a variable environ in methods before its defined:

def _createenviron():
    if name == 'nt':
        # Where Env Var Names Must Be UPPERCASE
        def check_str(value):
            if not isinstance(value, str):
                raise TypeError("str expected, not %s" % type(value).__name__)
            return value
        encode = check_str
        decode = str
        def encodekey(key):
            return encode(key).upper()
        data = {}
        for key, value in environ.items():
            data[encodekey(key)] = value
    else:
        # Where Env Var Names Can Be Mixed Case
        encoding = sys.getfilesystemencoding()
        def encode(value):
            if not isinstance(value, str):
                raise TypeError("str expected, not %s" % type(value).__name__)
            return value.encode(encoding, 'surrogateescape')
        def decode(value):
            return value.decode(encoding, 'surrogateescape')
        encodekey = encode
        data = environ
    return _Environ(data,
        encodekey, decode,
        encode, decode)

# unicode environ
environ = _createenviron()
del _createenviron

So how does environ get setup? I cant seem to reason about where its initialized and declared so that _createenviron can use it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋风の叶未落 2025-01-24 06:51:11

TLDR 在 os 模块内容中搜索 from posix import *

os 模块从 os 开头的 posix (Unix) 或 nt (Windows) 低级模块导入所有公共符号.py

posixenviron 公开为普通的 Python dict
os_Environ 类似字典的对象包装它,该对象更新 _Environ 项更改时的环境变量。

TLDR search for from posix import * in os module content.

The os module imports all public symbols from posix (Unix) or nt (Windows) low-level module at the beginning of os.py.

posix exposes environ as a plain Python dict.
os wraps it with _Environ dict-like object that updates environment variables on _Environ items changing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文