#python #python-3.x #testing #python-unittest #attributeerror
Вопрос:
Я рыскал по Интернету и придирался к своему коду, но, похоже, не могу найти, где код потерпел неудачу. Я прогнал код строка за строкой, но, похоже, никаких ошибок нет. Эта ошибка отображается в unittest. Python3 дает мне:
====================================================================== ERROR: test_numeric (test_numeric.TestNumeric) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/annahome/Documents/GitHub/DSP_Team8/test_numeric.py", line 16, in test_numeric self.assertEqual(dc1.get_unique(),7) File "/Users/annahome/Documents/GitHub/DSP_Team8/src/numeric.py", line 26, in get_unique return self.serie.dropna().unique.size AttributeError: 'NoneType' object has no attribute 'dropna'
Это от numeric.py
import streamlit as st from dataclasses import dataclass import pandas as pd import matplotlib.pyplot as plt import seaborn as sns @dataclass class NumericColumn: col_name: str = None serie: pd.Series = None def get_name(self): """ Return name of selected column """ return self.col_name def get_unique(self): """ Return number of unique values for selected column """ return self.serie.dropna().unique.size def get_missing(self): """ Return number of missing values for selected column """ return self.serie.isna().sum()
Это от test_numeric.py:
import unittest from src.numeric import NumericColumn import pandas as pd class TestNumeric(unittest.TestCase): def test_numeric(self): ### test on dummy data ### # create series of data dc1 = NumericColumn() dc1.col_name = "my_test" # test methods self.assertEqual(dc1.get_name(),"my_test") self.assertEqual(dc1.get_unique(),7) self.assertEqual(dc1.get_missing(),1)
Как мне устранить эту ошибку? Однако все остальное работает нормально…
Комментарии:
1. у
serie
вас его нет, и вы ему ничего не присваиваете. Почему вы ожидаете, что это изменится?2. По вашим собственным словам, что
serie: pd.Series = None
, по-вашему, делает? По вашим собственным словам, когдаself.serie.dropna()
это произойдет, чтоself.serie
должно быть? По вашим собственным словам, какая часть вашего кода должна это сделать?
Ответ №1:
В numeric.py
вас объявляют serie
и присваивают None
ему. Поскольку вы нигде в коде не назначаете ему что-то другое, serie
оно останется None
, поэтому вы не можете получить атрибут dropna
. Пожалуйста, убедитесь, что вы присвоили значение serie
перед получением атрибута dropna
. Пожалуйста , также помните, что serie: pd.Series = None
это не означает, что serie
мы обязательно одного типа pd.Series
, но что это просто подсказка кода и что он может принимать другой тип, если вы забыли.