尝试将* args传递给re.findall时出现TypeError

时间:2016-12-20 14:37:06

标签: python python-2.7

所以我有这个方法提取一些html数据和图像链接,将它组织成预制模板然后通过webbrowser.open显示它或者将整个html代码作为字符串返回(当用于外部程序时) )

在此之前,我只是在内部调用此函数并手动输入url,程序每次都成功创建了模板。现在re.findall()不接受元组* args,无论我尝试了什么(''.join, '{}'.format(tup), repr(), str()),它都没有用。使用Python 2.7.12。所以基本上我的问题是如何将* args(总是一个字符串)传递给create_template()?

def create_template(*args):
    p = re.compile('(?<=\/)[0-9]+|[0-9]+(?!.)')
    if args:        
        argstring = '{}'.format(args)
        itemID = re.findall(p,argstring)[0]
        new_html = change_links(itemID)
        info = get_walmart_info(itemID)
        template = finish_template(new_html,info)
        webbrowser.open('finished wtemplate.html')
        return template
    else:
        url = raw_input("Enter itemID/url: ")
        itemID = re.findall(p,url)[0]
        new_html = change_links(itemID)
        info = get_walmart_info(itemID)
        finish_template(new_html,info)
        webbrowser.open('finished wtemplate.html')

if __name__ == '__main__':
    create_template()

以及我得到的错误(在外部使用时,内部使用仍然正常):

Traceback (most recent call last):  
  File "<pyshell#23>", line 1, in <module>
    wTemplate.create_template('37651390')
  File "C:\Users\User\Desktop\Gal\Programming\wTemplate.py", line 91, in create_template
    argstring = '{}'.format(*args)  
  File "C:\Python27amd64\lib\re.py", line 181, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer

1 个答案:

答案 0 :(得分:1)

您的代码过于复杂。如果您的函数有零个或一个输入,则无需使用splat运算符。而是使用单个输入名称,使用默认参数来考虑无输入的情况:

def create_template(inpstr=None):
    p = re.compile('(?<=\/)[0-9]+|[0-9]+(?!.)')
    if inpstr:        # inpstr=='37651390' case
        argstring = '{}'.format(inpstr)
        itemID = re.findall(p,argstring)[0]
        # ...
    else:             # inpstr==None case
        url = raw_input("Enter itemID/url: ")
        itemID = re.findall(p,url)[0]
        # ...

当存在可变数量的输入参数并且您希望捕获输入中的所有内容时,最常需要使用fun(*args)。对于您的情况,您需要

def create_template(*args):
    p = re.compile('(?<=\/)[0-9]+|[0-9]+(?!.)')
    if args:        # args==('37651390',)
        argstring = '{}'.format(args[0]) # <-- args[0]
    # ...

相反,您将长度为1的元组传递给.format()