Как вызвать функцию внутри функции из модуля - PullRequest
0 голосов
/ 10 февраля 2020

У меня проблема с попыткой модульного тестирования моего кода. У меня есть скрипт с именем «compute_stats2.py», который содержит определенную функцию «compute_stats» внутри функции «main», потому что я хочу встроить аргумент командной строки в main позже по линии. Все функции, используемые в compute_stats, определены в main, но я исключил их ради аккуратности, пожалуйста, дайте мне знать, если вам нужно взглянуть на это. При этом я пытался выполнить модульное тестирование (см. Код ниже), и каждый раз, когда я пытаюсь запустить тест, возникает эта ошибка.

AttributeError: модуль 'compute_stats2' не имеет атрибута 'compute_stats'

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

PS заранее извиняюсь, если это действительно очевидное исправление, я не самый сильный кодер.


compute_stats2.py

def main():

  def compute_stats(values):
    if not values:
      return None
    else:
      o_min=minimum_of_list(values)
      o_max=values[-1]
      o_avg=average_of_list(values)
      o_median=median_of_list(values)
      return(o_min, o_max, o_avg, o_median)
if __name__ == '__main__':
  main()

test_compute_stats2.py

import unittest
import compute_stats2

class TestComputeStats2(unittest.TestCase):

def test_none_from_none(list):
    ret = compute_stats2.compute_stats(None)
    list.assertIsNone(ret)

def test_empty_list(list):
    ret = compute_stats2.compute_stats([])
    list.assertIsNone(ret)

def test_even_elements_list(list):
    ret = compute_stats2.compute_stats([1,2,3,4])
    list.assertEqual(ret, (1, 4, 2.5, 2.5))

def test_odd_elements_list(list):
    ret = compute_stats2.compute_stats([1,2,12])
    list.assertEqual(ret, (1, 12, 5, 2))

def test_single_element_list(list):
    ret = compute_stats2.compute_stats([43])
    list.assertEqual(ret, (43, 43, 43, 43))

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вы создали локальную функцию внутри main, которая называется compute_stats. Выполнение compute_stats будет происходить только при вызове main из-за правил области видимости. В результате вам нужно будет импортировать и запускать main, если вы хотите запустить compute_stats в его текущем состоянии.

Было бы неплохо переместить compute_stats за пределы main, если вы Я хотел бы импортировать его. Вы больше не будете создавать локальную функцию с ограниченным объемом действия в main.

Например,

def compute_stats(val):
 pass

def main():
 pass
1 голос
/ 10 февраля 2020

compute_stats() является внутренней функцией внутри main(). Так как вы не используете его внутри, вы можете вынуть его

def main(): # can be removed if there is no other use
  pass


def compute_stats(values):
  if not values:
    return None
  else:
    o_min=minimum_of_list(values)
    o_max=values[-1]
    o_avg=average_of_list(values)
    o_median=median_of_list(values)
    return(o_min, o_max, o_avg, o_median)

Кстати, если тесты находятся внутри класса, им нужно self в качестве первого параметра. Вы также должны изменить list как имя параметра, это встроенное имя.

def test_none_from_none(self, test_list):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...