2013-04-30 4 views
0

У меня есть небольшая проблема с форматированием строк. Я хочу заменить {} на ответы. Когда я меняю ответы, Thing будет правильно хранить new_answer, но неправильно печатает его. Он каким-то образом напечатает только первый символ!String .format() возвращает только первый символ

Что здесь происходит? Я действительно путают ..

class Thing(object): 

    def __init__(self,sentence,answer=None): 
     self.sentence = sentence 
     self.blanks = sentence.count("{}") 
     self.answer = (answer if answer else "___" for i in range(0,self.blanks)) 

    def __str__(self): 
     return self.sentence.format(*self.answer) 

    def changeAnswer(self,new_answer): 
     self.answer = new_answer 

    def returnAnswer(self): 
     return self.answer 

def test(): 
    thang = Thing("Please put it in the {}.") 
    print thang # Please put it in the ___. 
    thang.changeAnswer("BLANK") 
    print thang # Please put it in the B. 
    print thang.returnAnswer() # BLANK 

test() 

ответ

3

Вы использовали генератор при первой инициализации self.answer, но вы использовали строку в changeAnswer. Используя распаковку аргументов, вы распаковываете генератор строк в отдельные строки, но в итоге вы распаковываете строку в отдельные символы.

Что-то, как это должно исправить (а именно изменения в changeAnswer):

class Thing(object): 
    def __init__(self, sentence, answer=None): 
     self.sentence = sentence 
     self.num_blanks = sentence.count("{}") 
     self.answer = [answer or "___"] * self.num_blanks 

    def __str__(self): 
     return self.sentence.format(*self.answer) 

    def changeAnswer(self, new_answer): 
     self.answer = [new_answer] * self.num_blanks 

    def returnAnswer(self): 
     return self.answer 

def test(): 
    thang = Thing("Please put it in the {}.") 
    print thang # Please put it in the ___. 
    thang.changeAnswer("BLANK") 
    print thang # Please put it in the B. 
    print thang.returnAnswer() # BLANK 

if __name__ == '__main__': 
    test() 

Кроме того, я хотел бы избежать методов, как returnAnswer.

+0

Спасибо, это похоже на реальную сделку. Можете ли вы рассказать немного больше о том, почему я должен избегать возврата ответа (или отправить мне на страницу, которая может)? – user2245942

+0

@ user2245942: Это избыточно и на самом деле ничего не упрощает. Зачем вам писать 'print thang.returnAnswer()', когда вы можете просто сделать 'print thang.answer'? – Blender

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