在给出NameError的函数中输入String Argument作为变量

时间:2014-07-04 14:13:33

标签: python

我有这个代码块,它应该在提供股票代码时给出CIK号码:

def lookup_cik(ticker, name=None):
    good_read = False
    ticker = ticker.strip().upper()
    url = 'http://www.sec.gov/cgi-bin/browse-edgar?action+getcompany&CIK=(cik)&count=10&output=xml'.format(cik=ticker)

    try:
        xmlFile = urlopen ( url )
        try:
            xmlData = xmlFile.read()
            good_read = True
        finally:
            xmlFile.close()
    except HTTPError as e:
        print( "HTTP Error:", e.code )
    except URLError as e:
        print( "URL Error:", e.reason )
    except TimeoutError as e:
        print( "Timeout Error:", e.reason )
    except socket.timeout:
        print( "Socket Timeout Error" )
    if not good_read:
        print( "Unable to lookup CIK for ticker:", ticker )
        return
    try:
        root = ET.fromstring(xmlData)
    except ET.ParseError as perr:
        print( "XML Parser Error:", perr )

    try:
        cikElement = list(root.iter( "CIK" ))[0]
        return int(cikElement.text)
    except StopIteration:
        pass

然而,当它试图输入股票代码时我得到了

>>> lookup_cik(BDX)
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    lookup_cik(BDX)
NameError: name 'BDX' is not defined

我知道它是NameError但是我从未遇到过这样一个问题,即函数无法识别所谓的输入参数数据,在我们的例子中是股票代码是BDX。

1 个答案:

答案 0 :(得分:4)

你的函数需要一个字符串,所以传入一个:

lookup_cik("BDX")

如果没有引号,Python会将其解析为名称,但您从未将任何内容绑定到该名称(已分配给它)。

请注意,如果出现解析错误,您还会收到UnboundLocalError: local variable 'root' referenced before assignment个异常。您可能希望在此时退出该功能:

try:
    root = ET.fromstring(xmlData)
except ET.ParseError as perr:
    print( "XML Parser Error:", perr )
    return

您很可能会得到一个解析错误,因为您实际上从未在字符串中的任何位置插入自动收报机;您错过了{cik}占位符:

url = 'http://www.sec.gov/cgi-bin/browse-edgar?action+getcompany&CIK=(cik)&count=10&output=xml'.format(cik=ticker)

您可能打算在那里使用CIK={cik}。直接调用该网站的快速实验也表明您需要使用action=getcompany=代替+):

url = 'http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={cik}&count=10&output=xml'.format(cik=ticker)

因为您在list()上使用了root.iter(),所以整个表达式不会引发StopIterationlist()捕捉到这一点)。相反,表达式可能会提升IndexError

我在那里使用next()

cikElement = next(root.iter("CIK"), None)
return cikElement and int(cikElement.text)

或者更好的是,只需使用Element.find()

cikElement = root.find("CIK")
return cikElement and int(cikElement.text)