функция не дает ожидаемого результата, сбой модульного тестирования

#python #python-3.x

#python #python-3.x

Вопрос:

Я должен написать функцию file_stats , которая принимает имя файла в качестве параметра и возвращает кортеж, содержащий три числа: количество строк, количество слов и количество символов в файле

Я написал код, который не проходит модульное тестирование. Но результат в порядке.. Заранее спасибо. Как он может пройти модульное тестирование?

 num_lines = 0
num_words = 0
num_chars = 0

def file_stats(filename):  

   global num_lines, num_words, num_chars  

   with open(filename, 'r') as file:
       for line in file:
           words = line.split()
           num_lines  = 1
           num_words  = len(words)
           num_chars  = len(line)

   tuple1 = (num_lines, num_words, num_chars)
   file.close()
   return tuple1
  

SampleFile.txt

LIET

 Now, by Saint Peter's Church and Peter too,
He shall not make me there a joyful bride.
I wonder at this haste; that I must wed
Ere he, that should be husband, comes to woo.
I pray you, tell my lord and father, madam,
I will not marry yet; and, when I do, I swear,
It sh
  

Ожидаемый результат — (9,58,304)

Комментарии:

1. Какая версия, 2 или 3?

2. я использую python версии 3

3. Тогда почему вы добавили тег для 2.7?

4. о, так жаль, мои извинения

5. что делать, если файл ‘filename’ не существует, где для этого условие?

Ответ №1:

 global num_lines, num_words, num_chars
  

Вы используете глобальные переменные. Если модульный тестовый жгут повторно вызывает вашу функцию, эти переменные будут инициализированы только один раз, что приведет к неправильным результатам.

Вместо этого измените свой код на этот:

 def file_stats(filename):  

   num_lines, num_words, num_chars = (0,0,0)

   with open(filename, 'r') as file:
       for line in file:
           words = line.split()
           num_lines  = 1
           num_words  = len(words)
           num_chars  = len(line)

   return (num_lines, num_words, num_chars)
  

Вам не нужно закрывать файл вручную, диспетчер контекста ( with open(...) as file ) сделает это за вас

Комментарии:

1. я мог бы это сделать.. но все же для других.. это работает нормально.. спасибо за вашу помощь