CPython如何实现os.environ?
我正在查看源并注意到它引用了一个变量< 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
TLDR 在
os
模块内容中搜索from posix import *
。os
模块从os 开头的
。posix
(Unix) 或nt
(Windows) 低级模块导入所有公共符号.pyposix
将environ
公开为普通的 Pythondict
。os
用_Environ
类似字典的对象包装它,该对象更新_Environ
项更改时的环境变量。TLDR search for
from posix import *
inos
module content.The
os
module imports all public symbols fromposix
(Unix) ornt
(Windows) low-level module at the beginning ofos.py
.posix
exposesenviron
as a plain Pythondict
.os
wraps it with_Environ
dict-like object that updates environment variables on_Environ
items changing.