2012-07-10 67 views
0

我想知道,有沒有一種方法可以將開始和結束值存儲在我的主要方法中。我嘗試這樣做,但它給我的錯誤:將2個值存儲在一個變量中?

def searchM(): 

    fileAddress = '/database/pro/data/'+ID+'.txt' 
    with open(fileAddress,'rb') as f: 
     root = etree.parse(f) 
     for lcn in root.xpath("/protein/match[@dbname='M']/lcn") 
      start = int(lcn.get("start"))#if it is PFAM then look for start value 
      end = int(lcn.get("end"))#if it is PFAM then also look for end value 
    return "%s, %s" % (start, end,) 

values = searchM() 

(start, end,) = values 

的錯誤信息是UnboundLocalError:局部變量「開始」分配

+2

這行代碼:'返回 「%S%S」 %(start,end,)'在沒有分配'start'的情況下執行。現在已經結束了。即使你修復它,'(start,end,)= values'也不會起作用。你不能將一個字符串解壓到兩個變量中。 – 2012-07-10 22:46:54

+0

@DavidHeffernan我應該怎麼做才能得到這兩個值? – 2012-07-10 22:50:36

+0

好吧,只需返回一個元組:'return(start,end)'。然後像這樣解壓縮它們:'(start,end)= searchM()'。顯然,你需要確保'start'和'end'被分配。 – 2012-07-10 22:57:36

回答

2

前引用了您遇到的錯誤是由於startend變量。嘗試初始化它們,以便它們存在於即使沒有設置值的位置。

此外,您正嘗試創建並返回一個字符串,然後將其解包爲兩個不同的變量。

嘗試以下操作:

def searchM(): 
    fileAddress = '/database/pro/data/%s.txt' % ID 
    start = None 
    end = None 
    with open(fileAddress,'rb') as f: 
     root = etree.parse(f) 
     for lcn in root.xpath("/protein/match[@dbname='M']/lcn"): 
      start = int(lcn.get("start")) #if it is PFAM then look for start value 
      end = int(lcn.get("end")) #if it is PFAM then also look for end value 
    return start, end 

(start, end) = searchM() 
+0

我可以用另一種方法調用開始和結束值嗎?我將如何在另一個方法上調用這些開始和結束值 – 2012-07-10 23:03:23

+0

使用'values = searchM()'..'(start,end,)= values'。儘管首先將返回的值分配給變量並不是必需的,但您現在正在進行此操作。你可以簡單地將結果返回到所需的變量:'(start,end)= searchM()' – RobB 2012-07-10 23:05:09

+0

非常感謝你 – 2012-07-10 23:16:18

1

您需要爲start提供值,end如果他們沒有發現:

for lcn in root.xpath("/protein/match[@dbname='M']/lcn"): 
    start = int(lcn.get("start")) 
    end = int(lcn.get("end")) 
    break 
else: # not found 
    start = end = None 
+0

「break」改變了代碼的含義 – 2012-07-10 23:22:02

+0

它表達了作者的意圖,因爲我理解它 – jfs 2012-07-10 23:24:14

+0

您可能非常正確,但我只是想明確聲明 – 2012-07-10 23:25:48

相關問題