【问题标题】:AttributeError: 'Namespace' object has no attributeAttributeError:“命名空间”对象没有属性
【发布时间】:2015-04-09 23:11:51
【问题描述】:

我正在编写一个程序,它使用 urllib2 从 http 站点下载 CSV 数据。该程序在 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 库的一部分,因为它不是我编写的代码。 argparseurllib2 模块是否有其他人遇到过类似问题?

相关部分代码如下:

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)

【问题讨论】:

  • 从给出的路径来看,堆栈跟踪当然表明urllib2 模块中存在问题。
  • 向我们展示您编写的代码,以及您提供的输入。
  • 您发布的代码不包含错误行。您将req 设置为什么?
  • @tristan protocol = req.get_type() 行是 Python 标准库中 urllib2 模块的一部分;这不是我写的代码,而是urllib2.urlopen(url) 调用的代码
  • 但是您的示例中没有包含设置protocol=req.get_type() 的行,这意味着您仍然需要“发布代码”,可以这么说。我不知道你期望 req 存在哪里,因为没有成员方法urllib2.req

标签: python


【解决方案1】:

我遇到了这个问题,因为选项刺痛之前有一个空格。

【讨论】:

    【解决方案2】:

    长话短说。

    parser.parse_args() 返回的对象中的参数应该通过属性而不是通过[] 语法访问。

    错误

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

    正确

    args = parser.parse_args()
    args.method
    

    【讨论】:

    • 如果 arg 名称包含特殊字符怎么办?例如,我使用“”代替“method”。但是那么“args.”显然是无效的。
    • @gye 不要在参数名称中使用特殊字符?
    【解决方案3】:

    您正在将命令行参数解析为args,这是一个Namespace,其属性设置为已解析的参数。但是您将整个命名空间传递给downloadData,而不仅仅是url。这个命名空间然后被传递给urlopen,它不知道如何处理它。相反,请致电downloadData(args.url)

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2018-09-03
      • 2020-10-01
      • 2017-11-30
      • 2021-03-11
      • 2020-05-17
      • 2017-01-12
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多