我使用enums和string.join()方法在Python中形成一个帮助字符串:
我有以下代码段:
from enum import Enum
class Estimators(Enum):
rsac = 1
msac = 2
现在,我按如下方式创建一个帮助字符串:
est_help = 'Valid options are: [' + (str(i.name) + ', ' for i in Estimators) + ']'
这会将TypeError异常抛出为:
TypeError: cannot concatenate 'str' and 'generator' objects
我想知道我做错了什么。 i.name
是字符串类型。
答案 0 :(得分:3)
错误消息告诉您出错了什么 - 尝试连接字符串和生成器。你想要做的是使用基于生成器的列表推导来创建列表,然后使用
est_help = 'Valid options are: [{}]'.format( ', '.join( i.name for i in Estimators))
让我们将其分解为单独的步骤:
[rsac,msac]
:est_list = [str(i.name) for i in Estimators]
'rsac, msac'
分隔:est_str = ', '.join( est_list )
est_help = 'Valid options are: [{}]'.format( est_str )
,然后获取结果字符串Valid options are: [rsac, msac]'
编辑:包含评论建议的修改后的代码
est_help = 'Valid options are: [{}]'.format( ', '.join( i.name for i in Estimators ) )
答案 1 :(得分:2)
您可以加入Estimators的会员:
'Valid options are: [%s]' % ', '.join(Estimators.__members__)
答案 2 :(得分:1)
解决方案
est_help = 'Valid options are: [' + ",".join(str(i) for i in Estimators) + ']'
答案 3 :(得分:0)
由于所提到的帖子都没有为我工作(我总是得到'type'对象不可迭代,@ lvc想出来了,我有来自PyPI的枚举,它没有内置的迭代器函数)这里是我解决问题的方法
from enum import Enum
class Estimators(Enum):
rsac = 1
msac = 2
e = Estimators
attributes = [attr for attr in vars(e) if not attr.startswith('__')]
est_help = 'Valid options are: ' + str(attributes).replace('\'','')
print est_help
我使用vars获取类的成员,因为它们以字典格式存储,然后过滤掉以__
开头的所有成员,然后列表的元素显示为{{1的字符串我用空字符串替换它们。
如果我将我的解决方案与@SigveKolbeinson的答案结合起来,可以减少一些代码
'