2012-06-18 133 views
0

O.K.,我是從Perl到Python的,我沒有太多的Python經驗,所以對於那些對Python更有經驗的人來說,這看起來很明顯。爲什麼這個變量不可見?

無論如何,我只是加載一個配置文件,然後,作爲一個自檢,打印加載的值。代碼如下:

#!/home/y/bin/python2.7 
import logging 
import sys 
import datetime 
import yaml 

def main(self): 
    #initialize the logger 
    logger = logging.getLogger(self.granularity) 
    log_fh = logging.FileHandler(filename='/home/logs/pipelineTest/pipelineTest' + datetime.datetime.now().strftime('%Y%m%d_%H%M') + '.log', mode='w') 
    logger.addHandler(log_fh) 
    logger.setLevel(logging.INFO) 
    formatter = logging.Formatter('%(asctime)-6s: %(name)s - %(levelname)s - %(message)s') 
    log_fh.setFormatter(formatter) 

    #read configuration file 
    if sys.argv[1]: 
     ymlFH = open(sys.argv[1]) 
    else: 
     ymFH = open('/home/conf/pipelineTest/runPipeline.yml') 

    confDict = yaml.load(ymlFH) 

if __name__ == '__main__': 
    #self-test code 
    for key, value in confDict.iteritems(): 
     print 'Key is: ' + key + '\n' 
     print 'value is: ' + confDict[key] + '\n' 

我遇到的錯誤是:

Traceback (most recent call last): 
    File "./runPipeline.py", line 30, in <module> 
    for key, value in confDict.iteritems(): 
NameError: name 'confDict' is not defined 

我敢解釋的名稱「confDict」已經超出了範圍。我不明白爲什麼它超出了範圍。

+1

這實際上並不像你想象的那樣是一個python特定的問題。即使在perl中,你也必須調用函數(或子)來執行代碼。這就是說,如果你不使用超級可怕的「非嚴格模式」,Perl中的範圍應該是相同的概念 – jdi

回答

6

你的main()函數有它自己的範圍 - 不僅如此,但你永遠不會調用它。

我建議你從你的函數返回confDict,然後在你的跑步塊做confDict = main() - 或者,如果你不打算使用您的main()功能在多個地方,只要把它直降,不打擾的功能。

+0

謝謝jdi,只是設法在那裏鍵入錯誤的詞,好的跡象。 –

+0

我原本在那裏有主要功能,因爲我正在從事設置記錄器的例子使用它。 –

4

變量confDict定義在函數main()內部,所以它是該函數的局部。 (順便說一句,你甚至不叫main()。)

你可能想移動從劇本到main()函數結束的端部線圈,並在腳本的末尾呼籲main()代替。

0

confDict對於main是本地的,在python中,函數defenitions是indent的依賴。因此,當您嘗試在if語句內訪問它時,函數作用域已經結束,因爲main已經結束。 (見縮進)

0

這並不是說confDict超出了範圍,它從來沒有將轉換爲的範圍。

import ... 

def main(self): 
    ... 

if __name__ == '__main__': 
    #self-test code 
    for key, value in confDict.iteritems(): 
     print 'Key is: ' + key + '\n' 
     print 'value is: ' + confDict[key] + '\n' 

在那個if __name__ == ...的時候,你已經導入了一堆名字,並定義了一個名爲main功能。從未定義變量condDict。我不知道類似代碼將會定義condDict的任何語言,無論main中的...是什麼填充。

如果您請致電main,它將創建一個名爲confDict的變量。然而,這個名字將在本地特定調用main,所以你不能在有意義的功能之外使用它(想象你可以; main可以多次調用,併產生許多值confDict;當你?main之外的confDict?)。

我建議你通過一些Python教程。如果您已經熟悉一般的編程(即Perl),那麼您將通過它們開發,但他們會澄清所有這些基本的基本問題,以便您可以專注於編碼。


順便說一句,self作爲參數main是沒有意義的。刪除它並有def main():或使用def main(args)而不是從sys.argv內拉出main(我偏好用於後者)。