Пожалуйста, обратитесь к LearningPythonTheHardWay упражнение 48 для более подробной информации о назначении этого кода.Я все еще новичок, я знаю, что есть много способов улучшить или улучшить их.
Основная проблема, с которой я здесь сталкиваюсь, заключается в том, что в результате проверки носа коды добавляются ниже после лексики.py.
Короче говоря, у меня было 1 ошибка и 5 сбоев.
Ошибка:
NameError: global name 'ASDFADFASDF' is not defined
Сбой (ы):
AssertionError: None != [('direction', 'north')]
AssertionError: None != [('verb', 'go')]
AssertionError: None != [('stop', 'the')]
AssertionError: None != [('noun', 'bear')]
AssertionError: None != [('number', 1234)]
Где результаты были None вместо ответа с правой стороны.Для ошибки у меня был аналогичный результат из моих кодов, за исключением сравнения с test_error, где у меня было
[('error', 'ASDFADFASDF')]
результат теста
[('error', ASDFADFASDF)]
Что касается сбоя, типичное сообщение об ошибкеЯ получил это:
File "C:\xxx\xxxxxx\learningpython\projectex48\skeleton\tests\lexicon_tests.py", line 13, in test_verb
assert_equal(lexicon.scan("go"),[('verb', 'go')])
AssertionError: None != [('verb', 'go')]
-------------------- >> begin captured stdout << ---------------------
[('verb', 'go')]
--------------------- >> end captured stdout << ----------------------
Я не знаю, почему он работает только для 1 элемента, например, "go kill eat", Python только запускает "go".Я все еще пытаюсь понять логику и как ее исправить.Может ли кто-нибудь помочь мне выявить проблему того, почему я провалил 5 тестов и имел 1 ошибку.
Я потратил несколько недель, чтобы написать собственную версию функции сканирования для этого упражнения, это кодированиеof lexicon.py:
direction = [('direction', 'north'),
('direction', 'south'),
('direction', 'east'),
('direction', 'west'),
('direction', 'up'),
('direction', 'down'),
('direction', 'left'),
('direction', 'right'),
('direction', 'back')
]
verbs = [('verb', 'go'),
('verb', 'stop'),
('verb', 'kill'),
('verb', 'eat')
]
stop_words = [('stop', 'the'),
('stop', 'in'),
('stop', 'of'),
('stop', 'from'),
('stop', 'at'),
('stop', 'it')
]
nouns = [('noun', 'door'),
('noun', 'bear'),
('noun', 'princess'),
('noun', 'cabinet')
]
library = tuple(nouns + stop_words + verbs + direction)
def convert_number(x):
try:
return int(x)
except ValueError:
return None
def scan(input):
element = input.split()
data = library
i = 0
z = 0
output = []
temp = True
while (i == 0) or (not (element[(i-1)] == element[-1])):
try:
j = 0
while (j == 0) or (not data[(j-1)][1] == data [-1][1]):
matching = data[j][1]
if (matching == element[i]):
output.append(data[j])
j += 1
z += 1
temp = False
else:
while (data[j][1] == data [-1][1]) and (temp == True):
convert = convert_number(element[i])
a = tuple(['number', convert])
b = tuple(['error', element[i]])
if convert == a[1] and not(convert == None):
output.append(a)
temp = False
else:
output.append(b)
temp = False
j += 1
i += 1
temp = True
except ValueError:
return None
else:
pass
print output
Выше была упрощенная версия, которую я использовал для тестирования, концепция состоит в том, чтобы искать и собирать / добавлять данные, соответствующие вводу, а также сохранять и добавлять в выводзатем, наконец, распечатайте их все вместе.
Ниже приведены коды lexicon_tests.py, которые я непосредственно скопировал из книги:
from nose.tools import *
from ex48 import lexicon
def test_direction():
assert_equal(lexicon.scan("north"), [('direction', 'north')])
result = lexicon.scan("north south east")
assert_equal(result, [('direction', 'north'),
('direction', 'south'),
('direction', 'east')])
def test_verb():
assert_equal(lexicon.scan("go"),[('verb', 'go')])
result = lexicon.scan("go kill eat")
assert_equal(result, [('verb', 'go'),
('verb', 'kill'),
('verb', 'eat')])
def test_stops():
assert_equal(lexicon.scan("the"), [('stop', 'the')])
result = lexicon.scan("the in of")
assert_equal(result, [('stop', 'the'),
('stop', 'in'),
('stop', 'of')])
def test_nouns():
assert_equal(lexicon.scan("bear"), [('noun', 'bear')])
result = lexicon.scan("bear princess")
assert_equal(result, [('noun', 'bear'),
('noun', 'princess')])
def test_numbers():
assert_equal(lexicon.scan("1234"), [('number', 1234)])
result = lexicon.scan("3 91234")
assert_equal(result, [('number', 3),
('number', 91234)])
def test_errors():
assert_equal(lexicon.scan("ASDFADFASDF"), [('error', ASDFADFASDF)]) #refer to Update#1
result = lexicon.scan("bear IAS princess")
assert_equal(result, [('noun', 'bear'),
('error', 'IAS'),
('noun', 'princess')])
Здесь я сохранил файлы:
$ mkdir projectsex48
$ cd projectsex48/
$ mkdir skeleton
$ cd skeleton
$ mkdir bin
$ mkdir ex48 #(lexicon.py)
$ mkdir tests #(lexicon_tests.py)
$ mkdir doc
** Обновление № 1: ** Для ошибки
NameError: global name 'ASDFADFASDF' is not defined
Это произошло из-за отсутствия скобки '' в файле lexicon_tests.py для ASDFADFASDF, как показано ниже:
assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
Теперь у меня 6 сбоев, когда функция возвращает None.
AssertionError: None != [('direction', 'north')]
AssertionError: None != [('verb', 'go')]
AssertionError: None != [('stop', 'the')]
AssertionError: None != [('noun', 'bear')]
AssertionError: None != [('number', 1234)]
AssertionError: None != [('error', 'ASDFADFASDF')]