import discord
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('hello!')
client.run('your token here')
샘플봇 어서오고...
async def(비동기함수 선언문)위에 쓰여진 @client.event 보이시나요?
저걸 데코레이터라 합니다.
왜 쓸까요?
1. 파이썬에서 함수의 조건
파이썬에서 함수 (def)는 1급 객체(first citizen)입니다.
일반적인 함수는 입력값으로 변수를 받죠? 그렇다면 함수를 집어넣어 다른 함수를 출력하는 함수는 어떨까요?
파이썬에서 데코레이터는 그 역할을 수행합니다.
2. 데코레이터 사용법
def deco(func):
def decorated():
print('a')
func()
print('b')
return decorated
@deco
def main1():
print('메인 1 함수입니다.')
@deco
def main2():
print('메인 2 함수입니다.')
main1()
main2()
deco(func)라는 함수를 받는 함수를 하나 설정해주었습니다.
함수 위에 @deco만 붙이면 그 함수의 내용물은 decorated() 안의 func()에 들어가고, 실제로는 decorated()로 치환되어 출력됩니다. 쉽게 말해 합성함수죠. 결과를 한 번 볼까요?
a
메인 1 함수입니다.
b
a
메인 2 함수입니다.
b
다시 샘플봇으로 돌아가봅시다.
3. 샘플봇 해석하기
import discord
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('hello!')
client.run('your token here')
discord라는 모듈 안에는 Client()라는 함수가 있습니다. 우리는 이를 client로 치환할거구요.
함수는 총 2개입니다. 모두 비동기 함수로서, client.run('token')에 의해 동작하는 것을 알 수 있습니다.
client.run 함수는 discord(모듈).Client(클래스).run(함수)로서 서버와 연결하는 API와 위의 비동기 함수를 실행하는 두 가지 역할을 수행합니다.
client.event에는 다양한 종류가 있는데요, 클라이언트(사용자)가 어떤 이벤트를 발생시키면 client.event에서 그게 on_ready() 이벤트인지, on_message() 이벤트인지 판단합니다.
만약 비동기 함수 목록중 하나가 이벤트와 일치한다면 함수를 실행시킵니다. 그러나 @client.event가 데코레이터기 때문에, 함수를 다른 함수에 집어넣고 치환한 결과물을 실행시키겠죠? 데코레이터가 받는 함수는 discord 모듈 내에 존재할 것이구요.
client.run 함수에 Client가 클래스라고 했습니다. 다음시간에는 이 클래스가 어떻게 동작하는지 살펴봅니다. 어떻게 동작하는지 알게 되면 자연스레 API도 읽을 수 있을겁니다.
태그된 시리즈 바로가기 ↓↓
https://ghlabnote.tistory.com/tag/디스코드봇
https://ghlabnote.tistory.com/tag/파이썬%20문법
'프로젝트 > 설명' 카테고리의 다른 글
카페24 쇼핑몰 1. 시작하기 (0) | 2021.10.22 |
---|---|
디스코드봇 6. 코드의 원리 파악하기 (3) 객체 지향과 공식문서 활용법 (0) | 2020.12.20 |
CSS 핵심 내용 정리 (0) | 2020.12.17 |
디스코드봇 4. 코드의 원리 파악하기 (1) 비동기 처리 (0) | 2020.12.01 |
디스코드봇 3. 파이썬 가상환경 구축, 라이브러리 추가, 실행 (0) | 2020.11.28 |