如何缩短此代码(复制/粘贴多次相同的行)?

问题描述:

所以我有一些一段代码,看起来像这样:如何缩短此代码(复制/粘贴多次相同的行)?

import discord, asyncio 

client = discord.Client() 

@client.event 
async def on_member_update(preupd, postupd): 
    if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel('5')).read_messages == True: 
     embed = discord.Embed(title="Test", colour=0xFF000) 
     embed.add_field(name="Test", value="Test <#5>") 
     await client.send_message(client.get_channel('5'), embed=embed) 
    if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel('6')).read_messages == True: 
     embed = discord.Embed(title="Test", colour=0xFF000) 
     embed.add_field(name="Test", value="Test <#6>") 
     await client.send_message(client.get_channel('6'), embed=embed) 
    if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel('7')).read_messages == True: 
     embed = discord.Embed(title="Test", colour=0xFF000) 
     embed.add_field(name="Test", value="Test <#7>") 
     await client.send_message(client.get_channel('7'), embed=embed) 
    if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel('8')).read_messages == True: 
     embed = discord.Embed(title="Test", colour=0xFF000) 
     embed.add_field(name="Test", value="Test <#8>") 
     await client.send_message(client.get_channel('8'), embed=embed) 

client.run('ClientTokenHere') 

正如你所看到的,我复制/粘贴几乎同样的事情的4倍,但略有不同的细节。所以,我想通过使使代码更短,这样的功能:

import discord, asyncio 

client = discord.Client() 

@client.event 
async def on_member_update(preupd, postupd): 
    async def shorter(numba): 
     if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel(str(numba))).read_messages == True: 
      embed = discord.Embed(title="Test", colour=0xFF000) 
      embed.add_field(name="Test", value="Test <#%s>" % numba) 
      await client.send_message(client.get_channel(str(numba)), embed=embed) 

    shorter('5') 
    shorter('6') 
    shorter('7') 
    shorter('8') 

client.run('ClientTokenHere') 

然而,这给了我一个错误:myfile.py:35: RuntimeWarning: coroutine 'on_member_update.<locals>.perms' was never awaited,即使当我运行在顶部的“长”版本的代码,一切都正常运行顺利。很明显,我以某种方式错误地定义了该功能。我怎样才能解决这个问题?或者,还有更好的方法?由于

+1

你要调用函数为'等待短(“5”)'。 – jjm

+0

啊,谢谢@jjm –

你也可以做这样的事情:

import discord, asyncio 

client = discord.Client() 

@client.event 
async def on_member_update(preupd, postupd): 
    for numba in ('5', '6', '7', '8'): 
     if postupd.server.id == '1234' and postupd.permissions_in(client.get_channel(str(numba))).read_messages == True: 
      embed = discord.Embed(title="Test", colour=0xFF000) 
      embed.add_field(name="Test", value="Test <#%s>" % numba) 
      await client.send_message(client.get_channel(str(numba)), embed=embed) 

client.run('ClientTokenHere')