在此代码here中,他们使用while((line = reader.readLine()) != null)
获取环境变量的值,然后立即检查它是否是自定义类的实例。
Origin
os.environ
实际上是否可能是其自定义类的实例?这是死代码吗?
答案 0 :(得分:3)
我想,来自 outside 的任何东西都只是一个字符串。
另一方面,如果你要从Python代码中向环境中添加一些内容,那么你就可以获得更多的自由。
添加除字符串之外的任何内容仍然失败:
>>> os.environ['a'] = 89
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python27\lib\os.py", line 420, in __setitem__
putenv(key, item)
TypeError: must be string, not int
但是,您可以使自己的类继承自str:
class C(str):
pass
os.environ['a'] = C()
在Python2中,这似乎可以解决问题:
>>> type(os.environ['a'])
<class '__main__.C'>
然而,在Python 3中却没有。它看起来只是保存一个字符串:
>>> type(os.environ['a'])
<class 'str'>
但是,这并不能解释pyhocon的代码。我不知道该对象如何被推入os.environ
。
除非他们monkeypatched os.environ
......在这种情况下,任何事情都是可能的。
答案 1 :(得分:0)
os.environ
只是name: value
的简单映射。它只是在字典之上添加了一些味道以与环境相互作用。环境变量没有类型 - 它们是普通字符串。
您可以在bash中设置变量类型,但不会将其传递给其他程序。
$ declare -xi FOO=2
$ python -c 'import os;print(type(os.environ["FOO"]))'
即使从python内部调用进程,也无法传递除str
或bytes
之外的其他类型。
In [4]: subprocess.check_output(['python', '-c', 'import os;print(os.environ["FOO"])'], env={"FOO": 2})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-94f33d136e8f> in <module>()
----> 1 subprocess.check_output(['python', '-c', 'import os;print(os.environ["FOO"])'], env={"FOO": 2})