2016-10-03 59 views
-1

我正在編寫一些Python代碼& selenium webdriver。我得到了錯誤:Python我真的需要在每個函數中進行全局賦值

UnboundLocalError: local variable XXX referenced before assignment 

我在首次初始化該對象的主函數中進行全局賦值。在做了一些研究之後,我得到了在函數中分配全局變量的解決方案。我做了全局任務之一的函數,然後我得到了另一個函數中的錯誤

因此,我的問題是我真的需要分配全局分配在每個函數或只在第一次分配該全局變量。

樣本代碼時,我得到了錯誤:在clickLink()

class sample: 
    driver = None 
    def dclose(): 
     global driver # does it require #1 
     driver.close() 
     sys.exit(0) 
    def clickLink(): 
     global driver # does it require #2 
     try: 
      driver.find_element_by_link_text('about').click() 
     except: 
      print "Error: link not found" 
    def main(): 
     global driver # does it require #3 
     driver = webBase.Driver(URL) # another class where i have initalised webdriver with some logger activity. 
     clickLink() 
     dclose() 

其全球任務是必須分配全局後

class sample: 
    driver = None 
    def dclose(): 
     driver.close() 
     sys.exit(0) 
    def clickLink(): 
     try: 
      driver.find_element_by_link_text('about').click() 
     except: 
      print "Error: link not found" 
    def main(): 
     global driver 
     driver = webBase.Driver(URL) # another class where i have initalised webdriver with some logger activity. 
     clickLink() 
     dclose() 

現在?

+0

每個功能時,你沒有抱怨將'driver'聲明爲全局的,並且你不確定哪些是需要的? –

+0

我的程序中有8個函數用於檢測某個元素並執行一些數據庫活動。我通過在每個函數中聲明全局賦值來解決問題。但是我的問題是「這是一個正確的方案嗎?或者我所做的只是一個破解?」 –

+0

如果這是你的問題,那麼將問題置於實際問題上會很好。 –

回答

0

使用構造函數來指定它並自引用它。現在驅動程序是一個類級變量而不是全局變量。不需要時應避免使用全局範圍的變量。

class Sample: 

    def __init__(self): 
     self.driver = webBase.Driver(URL) 

    def dclose(): 
     self.driver.close() 
     sys.exit(0) 

    def clickLink(): 
     try: 
      self.driver.find_element_by_link_text('about').click() 
     except: 
      print("Error: link not found") 

    def main(): 
     clickLink() 
     dclose() 

爲了實現低耦合,這種實現是更好的,在這種情況下,駕駛員有實例樣本類時作爲參數傳遞:

class Sample: 

    def __init__(self, driver): 
     self.driver = driver 

    def dclose(): 
     self.driver.close() 
     sys.exit(0) 

    def clickLink(): 
     try: 
      self.driver.find_element_by_link_text('about').click() 
     except: 
      print("Error: link not found") 

    def main(): 
     clickLink() 
     dclose() 
+0

注意根據Python準則,我將類名改爲Sample而不是樣例。 – Bouke

+0

*現在驅動程序是一個類級別的變量* - 它是一個實例級別的屬性(變量) - 不是一個級別的一個... –

+0

喬恩我沒有得到你的答案 –

相關問題