2012-06-18 7 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' 

I가 발생하고있어 오류 : 나는 이름이 "confDict"로 해석하고 있습니다

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

는 범위를 벗어난왔다. 왜 그것이 범위를 벗어 났는지 이해가 안됩니다.

+1

이것은 실제로 생각할 수있는 것처럼 파이썬 특정 문제가 아닙니다. perl에서도 코드를 실행하기 위해 함수 (또는 서브)를 호출해야합니다. 당신이 슈퍼 무서운 "비 엄격 모드"를 사용하지 않는다면 perl의 범위는 똑같은 컨셉이어야한다고 말하고 있습니다. – jdi

답변

6

귀하의 main() 기능은 자체 범위를 가지고 있습니다.

난 당신이 함수에서 confDict를 반환 한 다음 실행중인 블록에 confDict = main()을 제안 - 두 개 이상의 장소에 main() 기능을 사용하지 않을 경우, 또는 바로 아래로 똑바로 넣어하지 않습니다 그 기능에 신경써라.

+0

감사합니다. jdi는 좋은 단어를 잘못 입력 한 것입니다. –

+0

필자가 로거를 설정하기 위해 사용하고있는 예제가 그것을 사용했기 때문에 원래는 주 기능이있었습니다. –

4

변수 confDict은 함수 main()에 정의되어 있으므로 해당 함수에 국한됩니다. 당신은 아마 main() 함수의 마지막에 스크립트의 끝에서 for 루프를 이동할

을 (그건 그렇고, 당신도. main()를 호출하지 않는다), 대신 스크립트의 끝에서 main() 전화 .

0

confDict는 main에 국한되며, python에서는 함수 defenitions가 들여 쓰기에 의존합니다. 따라서 main이 이미 종료 되었기 때문에 if 문에서 액세스하려고하면 함수 범위가 끝납니다. (들여 쓰기 참조)

0

confDict이 범위를 벗어났습니다. 범위로 사용하지 않았습니다. 그 if __name__ == ...의 시점에서

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' 

, 당신은 이름의 무리를 수입하고 main라는 함수를 정의했습니다. 변수 condDict이 정의 된 적이 없습니다. 나는 ...을 채우는 것과 관계없이 비슷한 코드가 condDict을 정의하는 언어를 모른다. main.

main으로 전화하면 이라는 변수가 생성됩니다. 그러나 해당 이름은 main의 특정 호출에 국한되므로 의미가있는 함수 밖에서는 사용할 수 없습니다 (main은 여러 번 호출 될 수 있으며 많은 값을 confDict으로 생성 할 수 있음을 의미합니다. confDict 외부 main?을 참조하십시오.

일부 파이썬 자습서를 사용해 보시기 바랍니다. 프로그래밍에 익숙하다면 (예 : Perl) 코딩 작업에 집중할 수 있도록 기본적인 기본 문제를 모두 명확하게 설명 할 것입니다.여담 selfmain의 인수만큼


는 이해되지 않는다. 그것을 제거하고 def main():을 가지고 있거나 sys.argvmain (당연히 후자에 해당)에서 꺼내는 대신 def main(args)을 사용하십시오.

관련 문제