Python: создание экземпляра класса дает AttributeError - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема. Когда я пытаюсь создать экземпляр класса, я получаю сообщение об ошибке. Вот некоторый код:

import parser

def main():
    tokens = [["TYPE_ONE", "value one"], ["TYPE_TWO", "value two"]]
    parse = parser.Parser(tokens)
    parse.parse()

main()

и parser.py:

class Parser(object):
    def __init__(self, tokens):
        self.tokens = tokens
        self.token_index = 0

    def parse(self):
        while self.token_index < len(self.tokens):
        token_type = self.tokens[self.token_index][0]
        token_value = self.tokens[self.token_index][1]
        print(token_type, token_value)
        self.token_index += 1

Но скрипт выдает следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/edyal/OneDrive/Desktop/Paigoa/src/main.py", line 8, in <module>
    main()
  File "C:/Users/edyal/OneDrive/Desktop/Paigoa/src/main.py", line 5, in main
    parse = parser.Parser(tokens)
AttributeError: module 'parser' has no attribute 'Parser'

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Из документации по модулям :

Когда импортируется модуль с именем спам, интерпретатор сначала ищет встроенный модуль с таким именем. Если он не найден, он ищет файл с именем spam.py в списке каталогов, заданных переменной sys.path

Список встроенных модулей зависит от установки и, как правило, является небольшим подмножеством стандартной библиотеки, и очень маловероятно, что модуль parser является встроенным модулем в вашей установке (вы можете проверить его, выполнив 'parser' in sys.builtin_module_names линия).

Скорее всего, проблема в вашей структуре каталогов. Например, если ваша структура каталогов следующая:

.
main.py
└── parser
    ├── __init__.py
    └── parser.py

и __init__.py не импортирует parser.py, чтобы импортировать parser/parser.py, вы должны выполнить этот код: from parser import parser

0 голосов
/ 05 сентября 2018

Это классическая ошибка в python: если вы называете свой модуль чем-то, что уже существует, вы не получаете модуль, о котором думали. Обычно это происходит наоборот. Например, вы вызываете свой csv-парсер csv.py и затем пытаетесь импортировать csv. Вы импортируете себя не стандартный модуль Python CSV.

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

>>> import parser
>>> dir(parser)
['ParserError', 'STType', '__copyright__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_pickler', 'compilest', 'expr', 'isex
pr', 'issuite', 'sequence2st', 'st2list', 'st2tuple', 'suite', 'tuple2st']

Сначала я рекомендую переименовать ваш parser.py во что-то более конкретное, например, в paigoa_token_parser.py Теперь измените ваш импорт:

import paigoa_token_parser

Теперь вы можете получить ошибку импорта, и в этот момент вы должны проверить свои пути. Ваш парсер находится в той же папке, что и main.py? Если нет, то вы можете добавить его в путь к питону

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