2012-02-06 6 views
0

У меня проблема, когда я пытаюсь использовать функцию из другого модуля, но эта функция вызывает функцию отладки, которая проверяет, имеет ли глобальная переменная определенный атрибут. Эта глобальная переменная не задана (в противном случае устанавливается с использованием parser.parse_args), когда я импортирую функцию, чтобы функция жаловалась, что атрибут не существует. Для уточнения:Как обойти неинициализированные глобальные переменные в другом модуле в Python?

Файл 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() 
    ... 

Файл copyafile.py

import findfile 

findfile.findfile("file1") 

Это дает мне

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

Теперь я понимаю, что parser.parse_args() возвращает пространство имен (??) и что _args.debug на самом деле не смотрит в dict. Но мой вопрос: как я могу в этой ситуации правильно назначить что-то _args, чтобы установить _args.debug на False?

Я не могу изменить findfile.py, но я могу изменить copyafile.py.

Как эти вещи обычно обрабатываются иначе? Что такое pythonic способ включения флагов отладки в сценарии?

ответ

1

findfile.py не так, как это написано, но вы можете попытаться сделать его работу в любом случае настройки вашего Argumentparser что-то вроде:

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

, а затем:

import findfile 
findfile._args = parser.parse_args() 

есть ваш _args.debug по умолчанию - False.

Об ошибке:

Вы AttributeError: 'dict' object has no attribute 'debug', beacuse вы пытаетесь получить доступ к dict, как если бы это был Namespace.

Возможно пример разъяснит то, что Namespace является:

>>> d = {'apple': 'red'} 
>>> d['apple'] 
'red' 
>>> from argparse import Namespace 
>>> ns = Namespace(apple='red') 
>>> ns.apple 
'red' 
+0

Если я правильно вас понял, вы хотите, чтобы я создать аргумент синтаксический анализатор в моем файле и установить _args переменную в другом модуле? Я не могу изменить первый файл – sPirc

+0

'findfile._args = Namespace (debug = False)' сделал трюк. Спасибо. – sPirc

+0

@sPirc: Мне жаль, что вам нужно иметь дело с этим уродливым 'findfile.py', поэтому я предполагаю, что любой хак является законным. Но я рад слышать, что вы решили свою проблему. Возможно, вы захотите принять этот ответ * (галочка слева) * :) –

Смежные вопросы