在给定名称的函数中输入字符串参数作为变量

2024-10-01 15:30:34 发布

您现在位置: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,但是我从来没有遇到过这样的问题:函数无法识别假定输入的参数数据stock ticker,在我们的示例中是BDX。你知道吗


Tags: nameurlreadaserrorlookuptickergood
1条回答
网友
1楼 · 发布于 2024-10-01 15:30:34

函数需要一个字符串,因此传入一个:

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)

因为您在root.iter()上使用了list(),所以整个表达式将不会引发StopIterationlist()捕捉到它)。相反,表达式可以引发IndexError。你知道吗

我用next()代替:

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

或者更好的方法是使用^{}

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

相关问题 更多 >

    热门问题