Python“os.environ.get”能否返回非字符串?

时间:2016-10-09 23:31:04

标签: python environment-variables

在此代码here中,他们使用while((line = reader.readLine()) != null)获取环境变量的值,然后立即检查它是否是自定义类的实例。

Origin

os.environ实际上是否可能是其自定义类的实例?这是死代码吗?

2 个答案:

答案 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内部调用进程,也无法传递除strbytes之外的其他类型。

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})