2014-01-18 2 views
-1

У меня есть несколько проблем, с которыми я не могу справиться даже после нескольких дней работы над ним.AssertionError и TypeError в Python

Toy не имеет переменные экземпляра и один метод, игры, которая возвращает строку "Squeak!\n" (с восклицательным знаком и капитала 'S', без пробелов и с новой строки в конце). Конструктор для Toy (его метод __init__) не принимает параметр (кроме обычного «я») и ничего не делает (поэтому его можно, вероятно, опустить).

A Dog имеет одну переменную экземпляра, ее имя, которое должно быть представлено в качестве параметра конструктору. Он имеет два метода:

call(self, shout) возвращает True если shout является именно "Here, n!" (с запятой, пространство и восклицательный знак, а не вводных или завершающих пробелов), где n это имя собаки. В противном случае он возвращает False.
play(self, toy, n) создает строку "Yip! " (с конечным пространством), соединенную с строкой, возвращаемой toy.play(). Он возвращает эту комбинацию, повторенную n раз, за ​​исключением случаев, когда n отрицательно, это то же самое, что и если бы это было 0. Уточнение: «s» повторяется 2 раза «ss». «s» повторяется 0 раз «».

Это то, что я есть:

class Toy: 

    def __init__(self): 
     pass 

    def play(self): 
     return "Squeak!\n" 

class Dog: 

    def __init__(self, name): 
     self.name = name 

    def call(self, shout): 
     self.shout = shout 
     if self.shout == 'Here, ' + self.name + '!': 
      return True 
     return False 

    def play(self, toy, n): 
     self.toy = toy 
     self.n = n 
     if n <= 0: 
      print('') 
     else: 
      for i in range(n): 
       print('Yip ' + self.toy.play()) 

Однако я получаю несколько ошибок, таких, как это:

TestDog2.test_dog_fancy_toy 

FAILURE: AssertionError 
None != 'Yip! Ding, Dong!\n' 

-

TestDog2.test_dog_play_once 

FAILURE: AssertionError 
None != 'Yip! Squeak!\n' 

-

TestDog2.test_dog_play_zero_twice 

ERROR: TypeError 
Can't convert 'NoneType' object to str implicitly 
+0

Когда вы получаете эти ошибки? Что такое код, который использует эти классы? Было бы неплохо опубликовать то, что у вас есть, но нам нужно больше, чтобы помочь вам. –

+0

его python 3. И я понятия не имею, почему я получаю такие ошибки. – user1864828

+0

Я не получаю половину того, что у вас там ... Вы создали экземпляр объекта «Собака и игрушка»? И остерегайтесь капитализации ... – RGS

ответ

1

В Toy классе, метод play возвращает строку, в то время как play метод Dog возвращает ничего (это просто напечатать материал).

Когда вы звоните dog.call(), вы не получите значение 'Yip ' + self.toy.play() взамен. Таким образом, функция возвращает None, как и ожидалось, и ваше утверждение неверно.
Чтобы исправить это, вы должны вернуть значение вместо его печати.

Например, в методе Dog.call():

if n <= 0: 
    return '' 
else: 
    phrases = ['Yip ' + self.toy.play() for i in range(n)] 
    return '\n'.join (phrases) 

phrases список построен using list comprehension. Он будет содержать n элементов, сформированных с помощью выражения 'Yip ' + self.toy.play(). Вам просто нужно объединить все элементы с помощью \n, чтобы создать новую строку после каждой фразы, и все готово.

+0

ahhhh спасибо! поэтому мне просто нужно было бы изменить 2 отпечатка на возврат def play (self, toy, n) :? – user1864828

+0

Что-то вроде этого, но будьте осторожны: вторая печать находится в цикле 'for'. Вам может понадобиться получить каждую строку и вернуть конкатенацию. Например, в списке понятий: 'return '\ n'.join ([' Yip '+ self.toy.play() для i в диапазоне (n)])' –

+0

Хмм, я думаю, что потерял вас там. я не научился использовать «join» в классе. вы могли бы написать код для той части, которую я объяснил мне? – user1864828

0
#!/usr/bin/env python 

class Toy: 
    def play(self): 
     return "Squeak!\n" 

class Dog: 
    def __init__(self, name): 
     self.name = name 

    def call(self, shout): 
     if shout == 'Here, ' + self.name + '!': 
      return True 
     return False 

    def play(self, toy, n): 
     if n <= 0: 
      print('') 
     else: 
      for i in range(n): 
       print('Yip ' + toy.play()) 

dog = Dog("Spot") # Spot the dog 
toy = Toy() 

assert(toy.play() == "Squeak!\n") 
assert(dog.call("Here, {0}!".format('Spot'), 'Here, Spot!') 

Не знаете, в чем ваш вопрос, но что может немного помочь?

Действительно, нам нужна дополнительная информация, чтобы помочь вам здесь.

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