Есть исходный код класса:
#!/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..." }