在循环

时间:2015-10-01 13:27:53

标签: python string generator

我使用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是字符串类型。

4 个答案:

答案 0 :(得分:3)

错误消息告诉您出错了什么 - 尝试连接字符串和生成器。你想要做的是使用基于生成器的列表推导来创建列表,然后使用

est_help = 'Valid options are: [{}]'.format( ', '.join( i.name for i in Estimators))

让我们将其分解为单独的步骤:

  1. 创建列表[rsac,msac]est_list = [str(i.name) for i in Estimators]
  2. 创建一个字符串,其中的列表元素用逗号'rsac, msac'分隔:est_str = ', '.join( est_list )
  3. 将字符串插入文字模板est_help = 'Valid options are: [{}]'.format( est_str ),然后获取结果字符串Valid options are: [rsac, msac]'
  4. 编辑:包含评论建议的修改后的代码

    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的答案结合起来,可以减少一些代码

'