【问题标题】:How can I make this code shorter (copy/pasted the same lines many times over)?如何使这段代码更短(多次复制/粘贴相同的行)?
【发布时间】:2017-11-22 09:51:14
【问题描述】:

所以我有一些看起来像这样的代码:

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.&lt;locals&gt;.perms' was never awaited,即使我在顶部运行“更长”版本的代码,一切都运行良好。显然我以某种方式错误地定义了函数。我怎样才能解决这个问题?或者,还有更好的方法?谢谢

【问题讨论】:

  • 你必须将函数调用为await shorter('5')
  • 啊,谢谢@jjm

标签: python python-3.x discord discord.py


【解决方案1】:

你也可以这样做:

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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2014-05-21
    相关资源
    最近更新 更多