2012-06-18 3 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 вы должны вызвать функцию (или sub) для выполнения кода. Это говорит о том, что область в perl должна быть одной и той же концепцией, если вы не используете супер страшный «нестрогий режим» – jdi

ответ

6

Функция main() имеет свою собственную область действия - не только это, но вы ее никогда не называете.

Я хотел бы предложить вам вернуться confDict из вашей функции, а затем сделать confDict = main() в вашем беговом блоке - или, если вы не собираетесь использовать main() функции в более чем одном месте, просто положить его прямо вниз, не беспокоиться о функции.

+0

Спасибо jdi, просто удалось ввести неправильное слово там, хороший знак. –

+0

Первоначально у меня была основная функция, потому что в примере, с которым я работал, для его настройки использовался логгер. –

4

Переменная confDict определена внутри функции main(), поэтому она является локальной для этой функции. (Кстати, вы даже не называют main().)

Вы, вероятно, хотите, чтобы переместить цикл с конца сценария до конца функции main() и вызвать main() в конце сценария вместо ,

0

confDict является локальным для основного, а в python функция defenitions зависит от отступа. Таким образом, область действия функции заканчивается, когда вы пытаетесь получить доступ к ней внутри оператора if, потому что main уже закончился. (См. Отступ)

0

Это не значит, что confDict вышел из сферы действия, он никогда не шел в scope.

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, что можно было бы использовать, когда вы см. confDict за пределами main?).

Я предлагаю вам работать с некоторыми учебниками по Python. Если вы уже знакомы с программированием в целом (например, Perl), то вы пронизываете их, но они прояснят все эти основные фундаментальные проблемы, чтобы сосредоточиться на кодировании.


Как и в сторону, self в качестве аргумента main не имеет никакого смысла. Либо удалите его, либо получите def main(): или используйте def main(args) вместо того, чтобы вытаскивать их из sys.argv в пределах main (предпочтение отдается последнему).