我的配置文件类似于:
[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)
我错过了什么?
答案 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
的第一个(唯一)元素是否为空。