2016-10-09 23 views
1

このコードhereでは、環境変数の値を取得するためにos.environを使用し、すぐにカスタムクラスのインスタンスであるかどうかを確認します。Pythonの "os.environ.get"は文字列以外の文字列を返すことはできますか?

value = os.environ.get(variable) 
... 
elif isinstance(value, ConfigList) or isinstance(value, ConfigTree): 

valueが自分のカスタムクラスのインスタンスになることを実際に可能ですか?このデッドコードですか?

+1

[documentation states](https://docs.python.org/3/library/os.html#os.environ)「文字列環境を表すマッピングオブジェクト」。それは他の何かをほとんど排除する。 'str'の代わりにバイトが必要な場合、Python 3は' os.environb'を持っています。 'str'(または' NoneType')として定義されていない限り、環境変数が 'ConfigList'か' ConfigTree'となるかどうかは分かりません。 – Evert

+0

コードが動作する証拠はありますか?そのすべてが例外ハンドラにあり、 'isinstance'が常に失敗すると実際にクラッシュすることはありません。 – zvone

+0

@zvone:テストケースで扱われていない行を見ている間に実際に見つけました。私はこのコードがどのように実行されるのか理解できませんでした。奇妙な部分は、このコードが最初から存在しているということです。このコードはリファクタリングの結果ではありません。まあ、それは時々私たち全員に起こります。 – movermeyer

答えて

2

の外にあるものは、以外のものは単なる文字列になります。

一方、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から継承された独自のクラスを作ることができます:Python2では

class C(str): 
    pass 

os.environ['a'] = C() 

を、これはトリックを行うようだ:

>>> type(os.environ['a']) 
<class '__main__.C'> 

しかし、Python 3ではそうではありません。それでも

>>> type(os.environ['a']) 
<class 'str'> 

pyhoconからコードを説明していない:それは単なる文字列が保存されますように見えます。そのオブジェクトがos.environにどのようにプッシュされるのかはわかりません。

monkeypatched以外の場合os.environ ...その場合は何でも可能です。

+0

'Configtree'と' ConfigList'クラスを見ましたか?'OrderDict'と' list'のサブクラス –

+0

@MosesKoledoyeはい、私はちょうど私の答えに追加を書いていました。 – zvone

+1

> "ただし、Python 3ではそうではありません。文字列を保存するように見えます。" これは次の行です:https://github.com/python/cpython/blob/6844dd01dd857ba8e606b5cf4a27cc37b8e2bece/Lib/os.py#L743 – skovorodkin

0

os.environは、name: valueの単純なマッピングです。それは、環境とやりとりするためにちょっとした言い分を加えるだけです。環境変数には、型がないプレーンな文字列があります。

変数型はbashで設定できますが、他のプログラムには渡されません。あなたのpythonの内部からプロセスを呼び出すとき

$ declare -xi FOO=2 
$ python -c 'import os;print(type(os.environ["FOO"]))' 

はさえ、あなたは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}) 
関連する問題