SafeConfigParser返回的列表是[''],但显示的len()为1

时间:2014-10-10 15:26:10

标签: python list configparser

我的配置文件类似于:

[Expected Response]
    GlobalResponse:

    UniqueResponse:
        1221

我尝试做的是,如果GlobalResponse为空,那么我们会依赖UniqueResponse设置。

subConfigParser = ConfigParser.SafeConfigParser(allow_no_value=True)   
subConfigParser.read(os.path.join(relativeRunPath, 'veri.cfg'))
commands = subConfigParser.get('Command List', 'commands').strip().split("\n")
expectedResponse = subConfigParser.get('Expected Response', 'GlobalResponse').strip().split("\n")
print expectedResponse
print len(expectedResponse)
if not expectedResponse:
    expectedResponse = subConfigParser.get('Expected Response', 'UniqueResponse').strip().split("\n")
    print "Size of unique: {}".format(len(expectedResponse))
    if len(expectedResponse) != len(commands):
        sys.exit(1)

然而,这是我得到的输出:

['']   # print expectedResponse
1      # print len(expectedResponse)

我错过了什么?

1 个答案:

答案 0 :(得分:1)

此行为是预期的。

['']是一个包含''的列表对象,它是一个空字符串对象。即使''为空,它仍然是一个对象,因此被视为列表中的一个元素。因此,len会返回1,因为列表中有一个项目。

以下是更好地解释的演示:

>>> len([]) # Length of an empty list
0
>>> # Length of a list that contains 1 string object which happens to be empty.
>>> len([''])
1
>>> # Length of a list that contains 2 string objects which happen to be empty.
>>> len(['', ''])
2
>>>

也许你打算写:

if not expectedResponse or not expectedResponse[0]:

如果expectedResponse为空[]或其第一个元素为空[''],则此if-statment的条件将通过。

请注意,如果expectedResponse始终包含元素,则应编写:

if not expectedResponse[0]:

这将测试expectedResponse的第一个(唯一)元素是否为空。