Ошибка Pycharm: ожидаемый тип [имя класса] вместо этого получил «str»

Я пытаюсь прочитать файл CSV в список, используя класс. Метод работает правильно из файла, содержащего метод, но когда я пытаюсь вызвать метод в main.py с помощью класса, я получаю следующую ошибку: Ожидаемый тип «Readit», вместо этого получил «str». Можете ли вы помочь мне исправить этот код, чтобы он работал, и объяснить, почему мой код неверен? ТИА.

Это мой каталог в Pycharm Проект->PythonTest->main.py, Stuff.py, test.csv

Содержимое CSV-файла

Содержимое файла test.csv: a,b,c (строка 1), 1,2,3 (строка 2) и 4,5,6 (строка 3).

Класс в Stuff.py

class Readit:

    def __init__(self, file_name):
        self.file_name = file_name

    def csv_to_list(self):
        from csv import DictReader
        with open(self.file_name) as a_file:
            csv_reader = DictReader(a_file)
            temp = csv_reader
            print(temp)

Файл main.py

from Stuff import Readit

file_name = "test.csv"
test_result = Readit.csv_to_list(file_name)
print(test_result)

При запуске в материале csv_to_list выдает этот вывод [{'a': '1', 'b': '2', 'c': '3'}, {'a': '4', 'b': '5', 'c': '6 '}]

но я получаю сообщение об ошибке ниже, когда пытаюсь вызвать метод в main.py

Ожидаемый тип 'Readit', вместо этого получен 'str'

Readit(file_name).csv_to_list() может работать лучше. Но было бы проще сделать это отдельной функцией, а не строить вокруг нее класс без особой причины.
Samwise 08.04.2023 19:45

Спасибо, Сэмвайз. Я намерен выполнить ряд операций с этим файлом. Это казалось подходящим использованием для класса? У меня гораздо больше опыта в функциональном программировании, поэтому я все еще борюсь с парадигмой ООП.

Artificer60 09.04.2023 19:51

Это не лучший вариант использования для определения собственного класса, потому что единственные данные в вашем классе — это имя файла, и для этого существует отличный существующий класс — str. ООП не означает, что все должно быть в своем собственном классе; смысл классов обычно в том, чтобы их можно было повторно использовать другим кодом как есть, и Python поставляется с множеством очень полезных и гибких встроенных классов.

Samwise 09.04.2023 21:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы отправили имя_файла в функцию, а не в объект, и ваша функция не возвращает никакого результата. Если вы немного измените свой код:

import csv

class Readit:

    def __init__(self, file_name):
        self.file_name = file_name

    def csv_to_list(self):
        dict_list = []
        with open(self.file_name, newline='') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                dict_list.append(row)
        return dict_list
        
def main():
    file_name = "test.csv"
    obj = Readit(file_name).csv_to_list()
    print(obj)
    
if __name__ == "__main__":
    main()

Выход:

[{'a': '1', 'b': '2', 'c': '3'}, {'a': '4', 'b': '5', 'c': '6'}]

Другие вопросы по теме