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?
CodePudding user response:
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.
