0

我有一种感觉,我很愚蠢。鉴于此 ini 文件:

[main]
source1 = ./testing/sdir1
sync1 = ./testing/sydir1
archive1 = ./testing/adir1
source2 = ./testing/sdir2
sync2 = ./testing/sydir2
archive2 = ./testing/adir2
[logging]
log_dir = .
log_file = pixelsync.log
log_level = DEBUG

以下代码挂起:

import ConfigParser

CONFIG_FILE = 'pixelsync.ini'

def parse_config() :
    """read details from the config file"""
    global CONFIG_FILE
    config = ConfigParser.SafeConfigParser()
    config.read(CONFIG_FILE)
    index = 1
    while True :
        if config.has_option('main', 'source' + str(index)) and \
                    config.has_option('main', 'sync' + str(index)) and \
                    config.has_option('main', 'archive' + str(index)) :

            result = ( config.get('main', 'source' + str(index)),
                       config.get('main', 'sync' + str(index)),
                       config.get('main', 'archive' + str(index)))
            index += 1
        else :
            if index == 1 :
                print "could not setup any trios from the config file. exiting."
                sys.exit(1)
    return result

if __name__ == '__main__' :
    options = parse_config()

它挂在“if”子句上。

如果我将“if”子句替换为:

if config.has_option('main', 'source1' ) and \
                    config.has_option('main', 'sync1' ) and \
                    config.has_option('main', 'archive1' ) :

它没有挂起。(不做我想做的事,因为我需要遍历任意数量的三组,但它不会静默挂起。

ubuntu 12.04(精确)上的 Python v2.7.3,32 位。

4

1 回答 1

1

你的程序挂起的原因是它永远不会跳出循环——它会永远持续下去。而不是简单地设置result,你需要return它。(另一种方法是设置它,然后使用它break跳出循环并返回,但这有点迂回。最好直接返回它。

请注意,这样做while True:和计数不是很 Pythonic,首选的方法是使用itertools.count().

例如:

import itertools

...

for index in itertools.count(1):
    ...

请注意,这表明存在设计缺陷。您可能想知道自己是否永远不会得到合适的结果。无限循环通常很糟糕。

于 2012-05-10T16:27:43.783 回答