Pythonの別のモジュールで初期化されていないグローバル変数を回避するにはどうすればよいですか?

私は別のモジュールの関数を使用しようとしているが、その関数はグローバル変数に特定の属性があるかどうかをチェックするデバッグ関数を呼び出すという問題があります。このグローバル変数は、関数がインポートされたときに設定されません(そうでない場合は parser.parse_args を使用して設定されます)。明確にするために:

ファイル findfile.py

_args = {}

def _debug(msg):
    if _TEST and _args.debug:
        print msg

def findfile(filename):
    ...
    _debug("found file")
    ...

if __name__ == "__main__":
    ...
    _args = parser.parse_args()
    ...

File copyafile.py

import findfile

findfile.findfile("file1")

これは私に

AttributeError: 'dict' object has no attribute 'debug'

これで、 dict parser.parse_args()が名前空間(??)を返し、 _args.debug 。しかし、私の質問です:この状況では、 _args.debug False に設定するために、 _args に何かを正しく割り当てることができますか?

findfile.py は変更できませんが、 copyafile.py を変更することができます。

これらのものは通常どのように扱われますか?スクリプトでデバッグフラグを有効にする方法は?

0

1 答え

findfile.py は書かれているとおり間違っていますが、 Argumentparser のようになります。

parser.add_argument('debug', action='store_true')

次に:

import findfile
findfile._args = parser.parse_args()

デフォルトで _args.debug False に設定してください。

あなたのエラーについて:

AttributeError: 'dict'オブジェクトに dict にアクセスしようとしていて、 名前空間 に移動します。

たとえば、 名前空間 a>は:

>>> d = {'apple': 'red'}
>>> d['apple']
'red'
>>> from argparse import Namespace
>>> ns = Namespace(apple='red')
>>> ns.apple
'red'
@sPirc:その醜い findfile.py を処理しなければならないと申し訳なく思っています。だから、ハッキングは合法だと思います。しかし、私はあなたの問題を解決したことを聞いてうれしいです。この回答を受け入れることができます(左側のチェックマーク) :)
追加された 著者 Rik Poggi,
私があなたを正しく理解していれば、私のファイルに引数パーサを作成し、他のモジュールに_args変数を設定したいのですか?私は最初のファイルを変更することはできません
追加された 著者 sPirc,
findfile._args =名前空間(debug = False)はそのトリックを行いました。ありがとうございました。
追加された 著者 sPirc,