Почему моя переменная не определена, даже если я использовал «глобальную»?

Я пытаюсь сделать компилятор COOL на Python, но к тому времени, когда я пытаюсь установить глобальную переменную, он говорит: «NameError: имя« comm_reg »не определено». Сначала я определяю переменную, а затем использую ее как глобальную, поэтому не понимаю, почему она не работает.

Есть идеи? Спасибо.

class CoolLexer(Lexer):

    comm_reg = False
    comm_line = False

    @_(r'[(][\*]')
    def COMMENT(self, t):
        global comm_reg
        comm_reg = True

    @_(r'[*][)]')
    def CLOSE_COMMENT(self, t):
        global comm_reg
        if comm_reg:
            comm_reg = False
        else:
            return t

    @_(r'[-][-].*')
    def ONE_LINE_COMMENT(self, t):
        global comm_line
        comm_line = True

    def salida(self, texto):
        list_strings = []
        for token in lexer.tokenize(texto):
            global comm_line
            global comm_reg
            if comm_reg:
                continue
            elif comm_line:
                comm_line = False
                continue
            result = f'#{token.lineno} {token.type} '

Похоже, вы хотите использовать переменные экземпляра класса. Какую библиотеку вы используете для определения Lexer?

Alex Hall 09.04.2019 11:18

Библиотека хитрая

Jon Peña 09.04.2019 11:27

Одним из применений классов является инкапсуляция глобальных переменных. Используйте объект self, а не global. :-)

TrebledJ 09.04.2019 11:48
Почему в 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
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Похоже, вы хотите что-то вроде этого:

class CoolLexer(Lexer):

    def __init__(self):
        self.comm_reg = False
        self.comm_line = False

    @_(r'[(][\*]')
    def COMMENT(self, t):
        self.comm_reg = True

    @_(r'[*][)]')
    def CLOSE_COMMENT(self, t):
        if self.comm_reg:
            self.comm_reg = False
        else:
            return t

    @_(r'[-][-].*')
    def ONE_LINE_COMMENT(self, t):
        self.comm_line = True

    def salida(self, texto):
        list_strings = []
        for token in self.tokenize(texto):
            if self.comm_reg:
                continue
            elif self.comm_line:
                self.comm_line = False
                continue
            result = f'#{token.lineno} {token.type} '

Да, это работает!!! Спасибо большое. Тогда в чем разница между глобальным и самостоятельным?

Jon Peña 09.04.2019 12:00

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