2016-12-20 68 views
0

所以我有這種方法提取一些html數據和圖像鏈接,組織它成爲一個預先製作的模板,然後通過webbrowser.open或通過webbrowser.open顯示它,或返回整個html代碼作爲字符串(當用於外部程序時)TypeError當試圖傳遞*參數re.findall

在此之前,我只在內部調用此函數並手動輸入url,程序每次都成功創建模板。現在re.findall()不接受元組*參數,不管我嘗試了什麼(''.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

您的錯誤和您的代碼似乎不匹配。 –

+0

你能提供一個示例輸入和期望的輸出嗎?我不清楚'create_template()'應該做什麼 –

回答

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()

+0

好吧,我不明白的部分是'(inpstr = None) '做得完全一樣。 除非另有說明,它是否使inpstr無?它是否告訴解釋器接受零參數? –

+0

無論如何,你的答案是爲我解決它的那個。 我明白*參數現在是一個列表...第一次插手它。 –

+0

@galalmighty它是一個元組,但它們很接近:)並且是的,'inpstr = None'告訴解釋器,如果沒有輸入(在那個位置),它會給這個變量賦值None。這使得這個輸入參數是可選的;正是你需要的。 –