2016-10-03 11 views
-1

私はPython &セレンのwebdriverのいくつかのコードを書いています。私はエラーが発生しました:Python私は本当に各関数のグローバル割り当てを行う必要があります

UnboundLocalError: local variable XXX referenced before assignment 

私はそのオブジェクトが最初に初期化されたmain関数でグローバル割り当てを行っていました。いくつかの研究をした後、私はグローバル変数を関数に代入するという解決策を得ました。私は関数の1つでグローバル割り当てを行った後、別の関数でエラーが発生しました。

私の質問は本当に各関数またはそのグローバル変数の最初の代入でグローバル代入を割り当てる必要がありますか?グローバル割り当ては必須ですclickLink(グローバル割り当てた後

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

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

サンプルコード、私はエラーを得ましたか?

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

、この実装が優れています、 'driver'をグローバルと宣言して、あなたはどちらが必要なのか不明です。 –

+0

私はいくつかの要素を検出し、いくつかのデータベース活動を行うために私のプログラムに8つの関数を持っています。私は各機能のグローバル割り当てを宣言することで問題を解決しました。しかし、私の質問は「これは正当なものか、あるいは私がやったことはちょうどハックなのか」ということです。 –

+0

それがあなたの質問だったら、実際の質問を入れるのは良いことでした。 –

答えて

0

コンストラクタを使用してそれを割り当て、自己によって参照します。ドライバはグローバルではなくクラスレベルの変数です。グローバルスコープの変数は、必要でない場合は避けるべきです。あなたはしなかったとき

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

Jon私はあなたの答えを得ませんでした –

関連する問題