所以我有这个方法提取一些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
答案 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()
。