(<-) |
[BioPythonTutorial/Advanced] |
(->) |
Chap 4.3 Parser Design
디자인 개괄
파서들은 event-oriented 디자인관점에서 만들어지며, scanner와 consumer객체를 포함한다.
scanner는 데이터소스로 부터 입력을 받고, 라인별로 분석하며, 데이터내의 특정정보를 인식할때마다 이벤트를 보내주는 역할을 한다. 예를들어, 데이터가 종이름을 포함한다면, scanner는 organism_name이라는 이벤트를 생성한다.
consumer는 scanner가 만든 이벤트를 받는 객체이다. 앞 예제에서 consumer는 organism_name 이벤트를 받고, 해당 어플리케이션에 맞는 작업을 수행한다.
이벤트
두가지 타입의 이벤트가 있다.
- info 이벤트 : 데이터 스트림 내에서 특정 정보의 위치꼬리표 이벤트
- section 이벤트 : 스트림내에서 section을 표시하는 이벤트
여기서, info event는 데이터내의 특정 라인과 관련되어 있는 반면, section event는 그렇지 않다.
section 이벤트 이름은 start_EVENTNAME 과 end_EVENTNAME 포맷내에 있어야 하며, 여기서, EVENTNAME은 해당 이벤트의 이름이다.
예를들어, FastaFormat의 scanner는 다음의 이벤트를 생성한다.
EVENT NAME ORIGINAL INPUT begin_sequence title >gi|132871|sp|P19947|RL30_BACSU 50S RIBOSOMAL PROTEIN L30 sequence MAKLEITLKRSVIGRPEDQRVTVRTLGLKKTNQTVVHEDNAAIRGMINKVSHLVSVKEQ end_sequence begin_sequence title >gi|132679|sp|P19946|RL15_BACSU 50S RIBOSOMAL PROTEIN L15 sequence MKLHELKPSEGSRKTRNRVGRGIGSGNGKTAGKGHKGQNARSGGGVRPGFEGGQMPLFQRLPK sequence RKEYAVVNLDKLNGFAEGTEVTPELLLETGVISKLNAGVKILGNGKLEKKLTVKANKFSASAK sequence GTAEVI end_sequence
따라서, FastaFormat의 scanner는 다음의 이벤트들을 생성한다. title, sequence, begin_sequence, and end_sequence. begin_sequence와 end_sequemce 이벤트는 원래 입력값의 어떤라인과도 관련되어 있지 않음을 참고한다.
scanner가 보낼수 있는 이벤트들은 각 데이터포맷에 대해 특별히 정해져있어야 한다.
'noevent' 이벤트
데이터파일이 의미없는 정보들을 가진 라인들을 포함하는 경우기 있다. blank lines같은 것들. 이런 라인들에 대해서 scanner는 'noevent'라는 이벤트를 만들어낸다.
Scanners
class Scanner: def feed(self, handle, consumer): # Implementation
scanner는 파일 핸들과 consumer를 취하는 'feed'라는 메쏘드를 지원해야한다. 파일 핸들로 부터 데이터를 읽고, consumer를 위한 이벤트를 생성해야하는 것이다.
Consumers
class Consumer: # event handlers
consumer는 이벤트들을 다루는 메쏘드들을 포함한다. 그 메쏘드의 이름은 그것이 다루는 이벤트의 이름이다. 정보를 포함하는 데이터의 라인에서, info event가 지나가며, section event는 아무것도 지나가지 않는다. 당신은 당신의 어플리케이션에서 관심없는 이벤트들에 대해서 무시하고 지나갈 수 있다. 그런 이벤트들에 대해 아무런 메쏘드도 적용하지 않으면 된다.
모든 consumer는 기본적인 Consumer class에서 유도되었다. 예를 들어,
class FASTAConsumer(Consumer): def title(self, line): # do something with the title def sequence(self, line): # do something with the sequence def begin_sequence(self): # a new sequence starts def end_sequence(self): # a sequence ends
이후절들
[BLAST] result, [ENZYME], [FASTA], MedLine, [PROSITE], SwissProt 에 대한 이벤트 리스트.