2015-10-01 4 views
0

Я использую перечисления и 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 имеет строковый тип.

+7

'(ул (i.name) + '' инт в RobustEstimators)' является генератор, так что вы можете 't добавить его в строку, точно так же, как сообщение об ошибке сообщает вам. Вы имели в виду '', '.join (...) '? – jonrsharpe

+0

Возможно, вам нужно 'est_help = 'Допустимые параметры: [' + str (i.name) + ',' для i в RobustEstimators + ']''? –

+0

@KevinGuan, как вы думаете, что это поможет? – jonrsharpe

ответ

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]'

редактировать модифицированный код включения предложений от комментариев

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

Вы можете сохранить некоторый шум линии, используя выражение генератора вместо понимания списка - просто отпустите '[]' внутри вызова 'join'. Кроме того, переносится из OP, но все же стоит упомянуть: 'i.name' уже является строкой, поэтому вы можете удалить вызов' str' для '',' .join (i.name для i в оценках)'. – lvc

1

Решение

est_help = 'Valid options are: [' + ",".join(str(i) for i in Estimators) + ']' 
+0

Было бы полезно, если бы вы могли объяснить OP (и будущим посетителям), как/почему этот код работает, или как добраться до него с позиции в вопросе, а не просто сказать «вот код». – lvc

2

Вы можете присоединиться к Участники:

'Valid options are: [%s]' % ', '.join(Estimators.__members__) 
0

Поскольку ни одна из должностей, упомянутых еще не работает для меня (я всегда получаю „оценщики типа“ объект не итерацию, @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, поскольку они хранятся в формате словаря, а затем отфильтровывают все члены, начинающиеся с __, а затем, поскольку элементы списка отображаются как строки с ', я заменяю их пустой строкой.

Часть кода может быть уменьшен, если я совмещаю мое решение с @ SigveKolbeinson отвечают как и

est_help = 'Valid options are: [{}]'.format(', '.join([str(i) for i in vars(Estimators) if not i.startswith('__')])) 
+0

Разница, вероятно, в том, что вы используете пакет 'enum' от PyPI. Вы можете получить бэкпортированную версию stdlib с пакетом 'enum34', и версии, выполняющие итерации' Estimators', непосредственно работают в нем. – lvc

+0

@ lvc это было. Спасибо, я не знал об этом. – SirParselot

Смежные вопросы