Найти - Пользователи
Полная версия: Не возвращает словарь
Начало » Python для новичков » Не возвращает словарь
1
Relrin
Уже целый час бьюсь не могу понять причину того, почему не возвращает словарь с данными.

Есть исходный код класса:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
    Класс анализа кода для метрики точек пересечения
"""
class MetricsPointIntersection:
    
  def __init__(self,code,cnt,flag,after_op):
      self._code  = code
      self._cnt   = cnt
      self._flag  = flag
      self._after = after_op
  @property
  def findSequence(self):
        """ Возвращает операторы в виде словаря, указанного в строке self._code """
        lst=[]
        dictionary={}
        # шаблон поиска
        ignore =["=>"]
        phrases=[".eql?","equal?","=>"]
        pattern=["**","==","+=","-=","*=","/=","**=","%=","===","!=",">=","<=","<=>",
                ".eql?","equal?","||","&&",">>","<<","^","!","~","<",">","=","+","-","*","/","%"]
        
        # смотрим, чтобы это не был многострочный комментарий
        if self._code.find("=begin")==0:
            self._flag=True
            return {}
        # если многострочный комментарий окончился, снимаем флаг и делаем срез
        if self._code.find("=end")==0 and self._flag:
            self._flag=False
            self._code=self._code[4:]
        # если однострочный и с начала строки - игноррируем ее
        indexSharp=self._code.find('#')
        if indexSharp==0:
            return {}
        else:
            # удаляем символы, которые не являются строками
            for i in ignore:
                while(self._code.find(i)!=-1):
                    index=self._code.find(i)
                    self._code=self._code[:index]+self._code[index+len(i):]
            # формирируем выходной словарь
            patterns=pattern
            while(patterns!=[]):
                # проициниализируем данные
                operator=patterns[0]
                # проверим, не является ли оператор набором букв и символом?
                if operator in phrases: PhraseInOp=True
                else: PhraseInOp=False
                block=self._code[:]
                cntOp=block.count(operator)
                if cntOp!=0:
                    if operator not in lst:
                        lst.append(operator)
                # запишем в список данные о кавычках, если они есть
                quote=[];
                for j in range(len(block)):
                    if block[j]=="\'" or block[j]=="\"": quote.append(j)
                # затем проанализируем операторы, находящиеся у нас в строке
                while(cntOp!=0):
                    NeedWrite=False
                    index=block.find(operator)
                    # считаем кавычки идущие после оператора
                    quotesCnt=0
                    for j in quote:
                        if j<index:
                            quotesCnt+=1
                    # затем рассматриваем как идет оператор с кавычками
                    if quotesCnt==0 or quotesCnt%2==0: NeedWrite=True # до/после кавычек
                    if quotesCnt%2==1: NeedWrite=False                # в кавычках
                    # ищем конец для строки с оператором
                    end=0;
                    string="";
                    if not PhraseInOp:
                        for i in range(index,len(block),1):
                            if(block[i].isalpha() or block[i].isdecimal() or block[i]=="_" or block[i]==" "):
                                end=i;
                                break;
                            else: string+=block[i]
                    if PhraseInOp:
                        for i in range(index,len(block),1):
                            if(block[i]=="_" or block[i]==" "):
                                end=i;
                                break;
                            else: string+=block[i]
                    # сравниваем полученные строки
                    if operator!=string: NeedWrite=False
                    # вырезаем этот символ из исходной строки
                    block=block[:index]+block[end:]
                    self._code=block
                    # запись данных в словарь
                    if NeedWrite:
                        dictionary[self._cnt]=[operator,self._after]
                        self._cnt+=1
                    # корректируем список с индексами кавычек
                    tmp=[]
                    for j in quote:
                        tmp.append(j-len(string))
                    quote=tmp
                    cntOp-=1
                patterns.remove(operator)
            # формируем список предыдущий операторов в строке
            self._after=lst
        return dictionary
    
if __name__ == '__main__':
    #string="+= ** + .eql? = &&"
    #obj=MetricsPointIntersection(string,0,0,"=")
    #print(obj.findSequence)
    
    file=open("C:\\Code\\Python\\test\\test.rb","r")
    cnt=1
    buf={}
    after=None
    flag=False
    file.seek(0)
    for line in file.readlines():
        string=line.replace('\n','')
        seqInRuby=MetricsPointIntersection(string,cnt,flag,after)
        #проверяем полученные данные
        if seqInRuby.findSequence!={}:
            buf.update(seqInRuby.findSequence)
            after=seqInRuby._after
            cnt=seqInRuby._cnt
        flag=seqInRuby._flag
    print(buf)
    file.close()

Если задать просто строку (которая как в коде, если скрипт запущен как “главный”) и отправить ее на обработку, то результат возвращается. В случае же когда считываю строку с файла, передаю ее методу, обрабатываю, результат не возвращает. Файл имеет примерно вид:
java_clicked = Proc.new { # ловим клик "Java" в меню
     lbl.text "Java was liked..."
}
sc_clicked = Proc.new { # ловим клик "Scala" в меню
     lbl.text "Scala was liked..."
}
py.user.next
Relrin
            # удаляем символы, которые не являются строками
            for i in ignore:
                while(self._code.find(i)!=-1):
                    index=self._code.find(i)
                    self._code=self._code[:index]+self._code[index+len(i):]
это записывается через .replace() без всякого цикла while

Relrin
                quote=[];
                for j in range(len(block)):
                    if block[j]=="\'" or block[j]=="\"": quote.append(j)
quote = [i for (i, c) in enumerate(block) if c in '\'"']

по-моему, достаточно дочитать до середины этого метода, чтобы потеряться в том, что он делает, несмотря на наличие комментариев

Relrin
Если задать просто строку (которая как в коде, если скрипт запущен как “главный”) и отправить ее на обработку, то результат возвращается.
в файле нужно ту же самую строку задать
не можешь обрабатывать построчно файл - прочитай его через .read() в строку
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB