MultiStrOpt vs ListOpt




最近需要设置OpenStack senlin里一个配置项event_dispatchers,这个配置项是MultiStrOpt类型的,按照官方文档尝试了很久还是不能用,senlin-engine日志报warning:

起初以为是我们用virtualenv虚拟环境的问题,没找到setup.cfg的entry_points里面配置的namespace senlin.dispatchers:

加断点单步调试,发现拿到的配置项是 ['database, message'] ,而不是 ['database', 'message'] 。

尝试把MultiStrOpt改成ListOpt之后,可以正常加载了。这表明要么是senlin的bug,要么是文档配置示例写错了。

MultiStrOpt到底怎么配置?找了好几个OpenStack项目,终于在keystone项目里面找到了一个示例

原来是要分多行写的。而ListOpt则是写一行,用逗号分隔。

二者的区别可以参考:http://markmail.org/message/5ut4rdjivpw6a6a6

我理解主要是为了支持等号后面的值里面包含逗号的配置项情况,比如”value1,value2″是一项,”value3,value4″是另一项,如果用ListOpt类型配置项,就没办法做到拆成两项(会拆成value1~4共4项),只能用MultiStrOpt来解决。

测试代码:

测试配置文件1:

执行结果:

测试配置文件2:

执行结果: