Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘dropna’

#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 , но что это просто подсказка кода и что он может принимать другой тип, если вы забыли.