2014-09-11 5 views
-1

Я преподаю себя Python через OCW MIT за 6.00. (Поэтому, пожалуйста, не комментируйте строки «Вы не должны задавать вопросы о домашнем задании» ... Я даже не в MIT, насколько я бы хотел.) Я сейчас застрял на Problem #3 in Problem Set #5 ,Функция не импортируется должным образом

Вот (отношение) часть ps5.py:

def update_hand(hand, word): 
    """ 
    Uses up all the letters in the given word and returns 
    the new hand. Does not modify hand. 

    word: string 
    hand: dictionary (string -> int) 
    """ 
    hand = hand.copy() 
    for char in word: 
     hand[char] = hand.get(char,0)-1 
    return hand 

def is_valid_word(word, hand, word_list): 
    """ 
    Returns True if word is in the word_list and is entirely 
    composed of letters in the hand. Otherwise, returns False. 
    Does not mutate hand or word_list. 

    word: string 
    hand: dictionary (string -> int) 
    word_list: list of lowercase strings 
    """ 
    if word not in word_list: 
     return False 
    after = update_hand(hand.copy(),word) 
    for char in after: 
     if after[char] < 0: 
      return False 
    return True 

Я побежал код и он возвращает правильный результат.

Loading word list from file... 
    83667 words loaded. 
play_game not implemented. 
play_hand not implemented. 
>>> word = "python" 
>>> hand = {'h':1,'n':1,'o':1,'p':1,'t':1,'y':1} 
>>> word_list = load_words() 
Loading word list from file... 
    83667 words loaded. 
>>> is_valid_word(word, hand, word_list) 
True 
>>> word = "cobra" 
>>> is_valid_word(word, hand, word_list) 
False 
>>> hand 
{'h': 1,'n': 1,'o': 1,'p': 1,'t': 1,'y': 1} 

Моя проблема заключается в том, что, когда функция is_valid_word импортируется в test_ps5.py, кажется, просто вернуть False за все, что означает, что он терпит неудачу половину тестов.

Вот (отношение) часть test_ps5.py:

from ps5 import * 

def test_is_valid_word(word_list): 
    """ 
    Unit test for is_valid_word 
    """ 
    failure=False 
    # test 1 
    word = "hello" 
    hand = {'h':1, 'e':1, 'l':2, 'o':1} 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '" + word + "' and hand:", hand 
     failure = True 
    # test 2 passes 
    # test 3 
    hand = {'n': 1, 'h': 1, 'o': 1, 'y': 1, 'd':1, 'w':1, 'e': 2} 
    word = "honey" 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '"+ word +"' and hand:", hand 
     failure = True 
    # test 4 passes 
    # test 5 
    hand = {'e':1, 'v':2, 'n':1, 'i':1, 'l':2} 
    word = "evil" 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '" + word + "' and hand:", hand 
     failure = True 
    # test 6 passes 
    if not failure: 
     print "SUCCESS: test_is_valid_word()" 

word_list = load_words() 

И вот результат, когда я запускаю код:

Loading word list from file... 
    83667 words loaded. 
---------------------------------------------------------------------- 
Testing get_word_score... 
SUCCESS: test_get_word_score() 
---------------------------------------------------------------------- 
Testing update_hand... 
SUCCESS: test_update_hand() 
---------------------------------------------------------------------- 
Testing is_valid_word... 
FAILURE: test_is_valid_word() 
    Expected True, but got False for word: 'hello' and hand: {'h': 1, 'e': 1, 'l': 2, 'o': 1} 
FAILURE: test_is_valid_word() 
    Expected True, but got False for word: 'honey' and hand: {'e': 2, 'd': 1, 'h': 1, 'o': 1, 'n': 1, 'w': 1, 'y': 1} 
FAILURE: test_is_valid_word() 
    Expected True, but got False for word: 'evil' and hand: {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2} 
---------------------------------------------------------------------- 
All done! 

Я не могу понять, что вызывает проблемы, когда и почему.

+1

Код ps5.py Код, который вы написали? Может быть, поместить некоторые инструкции печати в ваши циклы, чтобы помочь отладить то, что именно происходит, и где это происходит неправильно? – audiodude

+1

Вы пробовали его с тестовыми векторами, которые он фактически использует? –

+0

@ IgnacioVazquez-Abrams - Да, я пробовал каждый из тестовых векторов. Они работают так, как в ps psp. – 2012ssohn

ответ

0

Проблема не в коде, который вы опубликовали. Это прекрасно работает:

ps5.py:

def update_hand(hand, word): 
    """ 
    Uses up all the letters in the given word and returns 
    the new hand. Does not modify hand. 

    word: string 
    hand: dictionary (string -> int) 
    """ 
    hand = hand.copy() 
    for char in word: 
     hand[char] = hand.get(char,0)-1 
    return hand 

def is_valid_word(word, hand, word_list): 
    """ 
    Returns True if word is in the word_list and is entirely 
    composed of letters in the hand. Otherwise, returns False. 
    Does not mutate hand or word_list. 

    word: string 
    hand: dictionary (string -> int) 
    word_list: list of lowercase strings 
    """ 
    if word not in word_list: 
     return False 
    after = update_hand(hand.copy(),word) 
    for char in after: 
     if after[char] < 0: 
      return False 
    return True 

words.py:

#!/usr/bin/env python 

from ps5 import * 

def test_is_valid_word(word_list): 
    """ 
    Unit test for is_valid_word 
    """ 
    failure=False 
    # test 1 
    word = "hello" 
    hand = {'h':1, 'e':1, 'l':2, 'o':1} 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '" + word + "' and hand:", hand 
     failure = True 
    # test 2 passes 
    # test 3 
    hand = {'n': 1, 'h': 1, 'o': 1, 'y': 1, 'd':1, 'w':1, 'e': 2} 
    word = "honey" 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '"+ word +"' and hand:", hand 
     failure = True 
    # test 4 passes 
    # test 5 
    hand = {'e':1, 'v':2, 'n':1, 'i':1, 'l':2} 
    word = "evil" 
    if not is_valid_word(word, hand, word_list): 
     print "FAILURE: test_is_valid_word()" 
     print "\tExpected True, but got False for word: '" + word + "' and hand:", hand 
     failure = True 
    # test 6 passes 
    if not failure: 
     print "SUCCESS: test_is_valid_word()" 


def main(): 
    wordlist = ['honey', 'evil', 'python', 'dogs', 'weasels', 'hello'] 
    test_is_valid_word(wordlist) 

if __name__ == '__main__': 
    main() 

С обоих файлов в той же директории, вот вывод:

[email protected]:~/Documents/src/sandbox$ ./words.py 
SUCCESS: test_is_valid_word() 
[email protected]:~/Documents/src/sandbox$ 

Вы подразумевают несколько раз, что вы оставляете много «неуместного» кода. За исключением загрузки списка слов из файла, ни один из этих кодов не требуется для этой проблемы. Проблема должна быть где-то в коде, который вы не показываете. Поскольку для этой проблемы не требуется, я бы предложил либо (а) избавиться от всего этого; (б) избавление от него по частям, пока ваша проблема не будет исправлена, а затем постепенно добавьте обратно и регулярно тестируйте, чтобы вы могли точно увидеть, какой бит кода заставляет его сломаться; или (c) просто вставлять в операционные коды большое количество сообщений print, чтобы вы могли точно определить, где и почему это происходит, что даст вам представление о том, что происходит, и поможет вам изолировать, какой бит кода вызывает проблема.

Вы также не показываете, как вы звоните test_is_valid_word(), так что это может быть простая проблема с этим.

from something import * также является плохой идеей и иногда может вызывать таинственные проблемы, связанные с загрязнением пространства имен. Попробуйте вместо этого from ps5 import update_hand, is_valid_word и посмотрите, поможет ли это.

Без остальной части кода (что, опять же, кажется, не имеет никакого отношения к делу), вы единственный человек, который может совершать любую из этих вещей.

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