AttributeError: объект "Namespace" не имеет атрибута

Я пишу программу, которая использует urllib2 для загрузки CSV-данных с http-сайта. Программа работает нормально, когда запускается внутри Python, однако я также пытаюсь использовать argparse, чтобы иметь возможность вводить url из командной строки.

При запуске я получаю следующую ошибку:

File "urlcsv.py", line 51, in downloadData
    return urllib2.urlopen(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 396, in open
    protocol = req.get_type()
AttributeError: 'Namespace' object has no attribute 'get_type'

Я предполагаю, что это часть библиотеки urllib2, потому что это не код, который я написал. Кто-нибудь сталкивался с аналогичными проблемами с модулями argparse или urllib2?

Соответствующая часть кода выглядит следующим образом:

parser = argparse.ArgumentParser()
parser.add_argument("url")


def main():
    """Runs when the program is opened"""

    args = parser.parse_args()
    if args is False:
        SystemExit
    try:
        csvData = downloadData(args)
    except urllib2.URLError:
        print 'Please try a different URL'
        raise
    else:
        LOG_FILENAME = 'errors.log'
        logging.basicConfig(filename=LOG_FILENAME,
                            level=logging.DEBUG,
                            )
        logging.getLogger('assignment2')
        personData = processData(csvData)
        ID = int(raw_input("Enter a user ID: "))
        if ID <= 0:
            raise Exception('Program exited, value <= 0')
        else:
            displayPerson(ID)
            main()

def downloadData(url):

    return urllib2.urlopen(url)

Ответ 1

Вы анализируете аргументы командной строки в args, который является Namespace с атрибутами, установленными в анализируемые аргументы. Но вы передаете это полное пространство имен downloadData, а не только URL. Это пространство имен затем передается в urlopen, который не знает, что с ним делать. Вместо этого вызовите downloadData(args.url).

Ответ 2

Короче.

Аргументы в объекте, возвращенном из parser.parse_args() должны быть доступны через свойства, а не через синтаксис [].

Неправильно

args = parser.parse_args()
args['method']

Правильный

args = parser.parse_args()
args.method

Ответ 3

У меня была эта проблема из-за пробела перед опцией жала.