본문 바로가기
생물정보학/Biopython (바이오파이썬)

[바이오파이썬] 4.4 SeqRecord 비교 - NotImplemented 오류 - 파이썬 객체간의 비교 __eq__ 의 의미

by HanJoohyun 2018. 5. 26.
반응형

 

 


 

안녕하세요 한주현입니다.


오늘은 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

cs


그래서 비교를 이런식으로 하시면 됩니다 ㅎㅎ..






__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 객체 간 비교하는 방법에 대해 알아보았습니다.


부디 여러분들께 도움되셨음 좋겠네요

 

그럼 다음 시간에 만나요 ~~~~

 

 

 


반응형

댓글