안녕하세요 한주현입니다.
오늘은 SeqRecord 객체 간의 비교에 대해 알아보겠습니다.
목표
이전 포스팅까지 SeqFeature 객체에 대해 배워봤습니다.
http://korbillgates.tistory.com/141
http://korbillgates.tistory.com/144
오늘은 SeqRecord 객체 간의 비교하는 방법에 대해 알아보겠습니다.
그리고 그냥 끝내면 아쉬우니!! ㅋㅋ __eq__ 에 대해서도 알아볼까요?
준비물
오늘은 준비물이 없습니다 ㅎㅎ
그냥 biopython을 실행해주세요 ㅎㅎ
SeqRecord 객체 비교
Seq 객체에 id 를 넣어서 SeqRecord 객체를 만들어 보겠습니다.
서열은 그냥 아무거나 넣어보죠 ㅎㅎ
"ACGT" 로 해 볼까요?
1 2 3 4 5 6 | from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord record1 = SeqRecord(Seq("ACGT"), id="test") record2 = SeqRecord(Seq("ACGT"), id="test") | cs |
이렇게 하면 되겠죠?
이제 각 객체간의 비교를 하면 됩니다만..
먼저 파이썬 문자열 객체에서 비교를 알아보죠
1 2 3 4 5 | >>> str1 = "ACGT" >>> str2 = "ACGT" >>> str1 == str2 True | cs |
그냥 == 연산자로 각 객체를 비교합니다.
그런데 SeqRecord 객체는 == 로 하면 오류가 납니다 !!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> record1 == record2 --------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <ipython-input-2-7fade45e31fc> in <module>() ----> 1 record1 == record2 /home/jhan/anaconda3/lib/python3.6/site-packages/Bio/SeqRecord.py in __eq__(self, other) 735 736 def __eq__(self, other): --> 737 raise NotImplementedError(_NO_SEQRECORD_COMPARISON) 738 739 def __ne__(self, other): NotImplementedError: SeqRecord comparison is deliberately not implemented. Explicitly compare the attributes of interest. | cs |
요렇게 NotImplementedError 가 나오죠..
그러면 어떻게 비교하면 될까요?
SeqRecord 객체 간의 비교 방법
우리가 SeqRecord 객체를 비교한다는 것은 안에 있는 내용을 비교하고 싶다는 것이지요?
1 2 3 4 | >>> record1.id == record2.id True >>> record1.seq == record2.seq True |
그래서 비교를 이런식으로 하시면 됩니다 ㅎㅎ..
__eq__ 의 의미
str 객체는 == 연산이 되는데,
SeqRecord 객체는 == 연산이 왜 안되죠??
답은 __eq__() 메서드에 있습니다
__eq__ 메서드는 == 연산을 할 때 호출되는 메서드 입니다.
다른 예로는
1 2 3 4 5 6 7 8 9 10 11 | __lt__(self, other): x < y ## Less than __le__(self, other): x <= y ## Less equal __gt__(self, other): x > y ## Greater than __ge__(self, other): x >= y ## Greater equal __eq__(self, other): x == y ## Equals __ne__(self, other): x != y ## Not equals | cs |
요런것들이 있죠 ㅎㅎ
다시 __eq__ 로 돌아와서 ㅎㅎ
오류 난 부분을 자세히 들여다 보면 라인 7번째를 보시면..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> record1 == record2 --------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <ipython-input-2-7fade45e31fc> in <module>() ----> 1 record1 == record2 /home/jhan/anaconda3/lib/python3.6/site-packages/Bio/SeqRecord.py in __eq__(self, other) 735 736 def __eq__(self, other): --> 737 raise NotImplementedError(_NO_SEQRECORD_COMPARISON) 738 739 def __ne__(self, other): NotImplementedError: SeqRecord comparison is deliberately not implemented. Explicitly compare the attributes of interest. | cs |
저는 경로가 /home/jhan/anaconda3/lib/python3.6/site-packages/Bio/SeqRecord.py 로 되어있는데
이 파일을 열어보시면..
1 2 3 4 5 6 7 | class SeqRecord(object): ... 생략 ... def __eq__(self, other): raise NotImplementedError(_NO_SEQRECORD_COMPARISON) ... 생략 ... | cs |
__eq__ 메서드가 NotImplementedError 를 일으키도록 되어있습니다
그래서 == 연산을 하면 NotImplementedError 가 나오게 되는 것 이지요 ㅎㅎ..
오늘은 Biopython에서 SeqRecord 객체 간 비교하는 방법에 대해 알아보았습니다.
부디 여러분들께 도움되셨음 좋겠네요
그럼 다음 시간에 만나요 ~~~~
'생물정보학 > Biopython (바이오파이썬)' 카테고리의 다른 글
[도서] 바이오파이썬으로 만나는 생물정보학 (26) | 2019.03.12 |
---|---|
[바이오파이썬] 5.1.1 SeqIO 모듈로 서열 파일 읽기 - FASTA (12) | 2018.12.24 |
[바이오파이썬] 4.3.2 SeqFeature 의 position, location (0) | 2018.05.24 |
[바이오파이썬] 4.3.1 SeqFeature 객체 (0) | 2018.05.22 |
[바이오파이썬] 4.2 Sequence Record 객체 - FASTA, GenBank 파일로 부터 생성하기 (6) | 2017.10.30 |
댓글