0

好的,我是从 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”已超出范围。我不明白为什么它超出了范围。

4

4 回答 4

6

你的main()函数有它自己的范围——不仅如此,而且你永远不会调用它。

我建议你confDict从你的函数返回,然后confDict = main()在你的运行块中执行 - 或者,如果你不打算main()在多个地方使用你的函数,直接把它放下,不要打扰这个函数。

于 2012-06-18T22:05:56.930 回答
4

该变量confDict是在函数内部定义的main(),因此它是该函数的本地变量。(顺便说一句,你甚至不打电话main()。)

您可能希望将 for 循环从脚本末尾移动到main()函数末尾,并main()在脚本末尾调用。

于 2012-06-18T22:05:59.353 回答
0

confDict 对 main 来说是本地的,并且在 python 中,函数定义依赖于缩进。因此,当您尝试在 if 语句中访问它时,函数范围就结束了,因为 main 已经结束。(见缩进)

于 2012-06-18T22:08:09.960 回答
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时,这意味着?)。confDictmain

我建议您阅读一些 Python 教程。如果您已经对一般编程(即 Perl)很熟悉,那么您将彻底了解它们,但它们会阐明所有这些基本的基础问题,以便您可以专注于编码。


顺便说一句,作为没有意义self的论点。main删除它并拥有def main():或使用而不是将它们从内部def main(args)拉出来(我更喜欢后者)。sys.argvmain

于 2012-06-19T01:38:38.613 回答