Python 3.5에선 여러가지 기능이 추가되는데 그 중 한가지로@ 연산자가 추가됩니다. 원래 목적은 행렬곱을 보다 깔끔하게 표현하자는 취지입니다. NumPy등을 배려해주는 취지로 보입니다. 하지만 나는 @ 연산자를 보고 엉뚱한 생각을 했습니다.

저걸로 Email 주소를 표현해보면 어떨까?

일단 첫 아이디어는 다음과 같았습니다.

>>> from emaillib import Host
>>> gmail = Host('gmail.com')
>>> addr = 'somebody' @ gmail
>>> str(addr)
sombody@gmail.com

(소스 강조에 @ 부분에 경고가 떠서 보일텐데, 이건 소스가 아니라 Pygments의 문제입니다. 언젠가 고쳐지길 희망해봅니다.)

이것은 Python 3.5에서 추가되는 __rmulmat__을 구현하면 실제 구현이 가능합니다.

이것을 가지고 농담따먹기를 하다가 메일을 실제로 보낼 수도 있어야 하지 않냐는 이야기가 나와서 이런 예제 코드를 만들게 되었습니다.

>>> from emaillib import Host
>>> gmail = Host('gmail.com')
>>> hotmail = Host('hotmail.com')
>>> subject = 'Hey! You are hacked!'
>>> content = 'Check Your Account!'
>>> 'sender' @ gmail / subject // content >> ['hacked' @ gmail, 'hacked2' @ hotmail]
Sended!

사실 구현 자체는 가능할 것으로 보입니다. 다만 문제는 이것은 파이썬의 철학에 철저하게 위배되는 구성이라는 점이죠. 누가 저걸 보고 메일을 보내는 동작이라고 상상이나 할 수 있겠습니까? 그래서 조금 더 명확한 표현법을 쓰는 방식으로 바꿔보았습니다.

>>> from emaillib import Host
>>> gmail = Host('gmail.com')
>>> hotmail = Host('hotmail.com')
>>> mail = 'sender' @ gmail
>>> mail.receivers = ['hacked' @ gmail, 'hacked2' @ hotmail]
>>> mail.subject = 'Hey! You are hacked!'
>>> mail.content = 'Check Your Account!'
>>> mail.attach_file('hack.log', open('hack.log'))
>>> mail.charset = 'utf-8'
>>> mail.server = 'localhost'
>>> mail.send()
Sended!

그나마 이쪽은 조금 더 소스가 눈에 잘 들어옵니다. (나만 그럴지도 모르지만) 이쯤 되면 장난감 프로젝트라기보다는 @ 연산자는 joke point일 뿐인 email wrapper가 될 것 같습니다. 다만 Python 3.5 이상에서만 joke point를 쓸 수 있으니 상관 없을지도 모르겠네요.

이것을 실제로 구현을 할지 말지로 고민중에 있긴 한데, 사실 이미 maillib이라는 프로젝트가 있기 때문에 그 앞에 e한글자만 더 붙여서 만드는건 좀 얌체짓 아닌가 싶은 생각을 하고 있습니다. (물론 사용법이 절대적으로 다르고 저쪽도 아직 Alpha라는 점이 중요하지만)

아는 프로그래머 E모님께서는1 @ 연산자를 가지고 decorator에 장난을 치는 사람이 나올 것 같다고 하셨는데, 상당히 끔찍한 발상이라고 생각합니다. 그에 비하면 내가 낸 아이디어는 그냥 웃고 넘어갈 수 있는 수준이니까 괜찮지 않을까 하는 생각을 해봅니다. 아마 지금 하고 있는 일이 끝나면 Python 3.5 beta를 깔고 실제로 구현해보지 않을까 하는 생각이 들고 있긴 합니다.


  1. 이상한 모임의 주인장의 별명인 이모님을 말한게 아닙니다!