Python 如果部分来自elif部分,如何重新触发?

Python 如果部分来自elif部分,如何重新触发?,python,if-statement,discord.py,Python,If Statement,Discord.py,当我编写这个discord.py命令时,我突然想到“复活节彩蛋”是这个命令的一部分 想法是,如果有人键入“+fact birb”(“+fact(a string)”触发此命令),它将首先发送“复活节彩蛋”嵌入(我已经在elif部分中进行了编码),然后发送另一个嵌入,如果有人键入“+fact bird”(如果是部分则触发) 我想问的是,将“如果部分”复制并粘贴到“elif部分”是否是唯一的答案,或者是否有其他方法从'elif部分中触发'if部分' 如果您的答案是在elif部分输入“+fact bi

当我编写这个discord.py命令时,我突然想到“复活节彩蛋”是这个命令的一部分

想法是,如果有人键入“+fact birb”(“+fact(a string)”触发此命令),它将首先发送“复活节彩蛋”嵌入(我已经在elif部分中进行了编码),然后发送另一个嵌入,如果有人键入“+fact bird”(如果是部分则触发)

我想问的是,将“如果部分”复制并粘贴到“elif部分”是否是唯一的答案,或者是否有其他方法从'elif部分中触发'if部分'

如果您的答案是在elif部分输入“+fact bird”重新触发整个命令,我可以接受

代码如下:

 @command(name='fact')
    async def animal_fact(self, ctx, animal: str):
        if (animal := animal.lower()) in ('dog', 'cat', 'panda', 'fox', 'bird', 'koala'):
            fact_url = f'https://some-random-api.ml/facts/{animal}'
            image_url = f'https://some-random-api.ml/img/{"birb" if animal == "bird" else animal}'
            async with request('GET', image_url, headers={}) as response:
                if response.status == 200:
                    data = await response.json()
                    image_link = data['link']
                else:
                    image_link = None

            async with request('GET', fact_url, headers={}) as response:
                if response.status == 200:
                    data = await response.json()
                    embed = Embed(title=f'{animal.title()} fact',
                                  description=data['fact'],
                                  colour=ctx.author.color)
                    if image_link is not None:
                        embed.set_image(url=image_link)
                    await ctx.send(embed=embed)
                else:
                    await ctx.send(f'API returned a {response.status} status.') 

        elif (animal := animal.lower()) == 'birb':
            birb_num = randrange(3)
            if birb_num == 0:
                birb_url = 'https://upload3.inven.co.kr/upload/2020/04/18/bbs/i13666922526.jpg'
            elif birb_num == 1:
                birb_url = 'https://cdn.download.ams.birds.cornell.edu/api/v1/asset/85774871/1800'
            else:
                birb_url = 'https://www.4flix.co.kr/data/file/gallery/3743818203_HLK71nSR_d2bc42b6af7e42d5a78dce28231a600a7dc10fc8.jpg'
            async with request('GET', birb_url, headers={}) as response:
                if response.status == 200:
                    embed_c = Embed(title = "You've been greeted by this cute birb. continue to the bird facts.",
                                    colour = 0xDAA520)
                    embed_c.set_image(url=birb_url)
                    await ctx.send(embed=embed_c)
                else:
                    await ctx.send(f'API returned a {response.status} status.')

        else:
            await ctx.send('No facts are available for that.\nfacts availabe for: dog, cat, panda, fox, bird, koala')

这正是函数存在的原因。作为程序员,你不应该有重复的代码。每次使用此代码块
(go()函数)
时,可以传递不同的参数,例如
birb_url
,以实现相同的目标,但功能不同

async def go(birb_url:str, title:str, color):
    async with request('GET', birb_url, headers={}) as response:
        if response.status == 200:
            embed_c = Embed(title=title,
                            colour=color)
            embed_c.set_image(url=birb_url)
            await ctx.send(embed=embed_c)
            return  # some value
        else:
            await ctx.send(f'API returned a {response.status} status.')
            return  # some value

我可以看出,每次使用
request
都有点不同,所以请尝试使用不同的函数。检查哪些代码行可以合并到一个函数中,哪些不能。

我意识到我可以合并两个函数中的“事实嵌入”部分,因为“if sequence”不一定需要elif或else部分。所以,我在下面写了另一个“如果”来发送额外的鸟图片

@command(name='fact')
@cooldown(3, 10, BucketType.guild)
async def animal_fact(self, ctx, animal: str):
    if (animal := animal.lower()) in ('dog', 'cat', 'panda', 'fox', 'birb', 'bird', 'koala'):
        if animal == 'birb':
            birb_num = randrange(3)
            if birb_num == 0:
                birb_url = 'https://upload3.inven.co.kr/upload/2020/04/18/bbs/i13666922526.jpg'
            elif birb_num == 1:
                birb_url = 'https://cdn.download.ams.birds.cornell.edu/api/v1/asset/85774871/1800'
            else:
                birb_url = 'https://www.4flix.co.kr/data/file/gallery/3743818203_HLK71nSR_d2bc42b6af7e42d5a78dce28231a600a7dc10fc8.jpg'
            async with request('GET', birb_url, headers={}) as response:
                if response.status == 200:
                    embed_c = Embed(title = "You've been greeted by this cute birb. Please continue to the bird fact.",
                                    colour = 0xDAA520)
                    embed_c.set_image(url=birb_url)
                    await ctx.send(embed=embed_c)
                else:
                    pass
            
        fact_url = f'https://some-random-api.ml/facts/{"bird" if animal == "birb" else animal}'
        image_url = f'https://some-random-api.ml/img/{"birb" if animal == "bird" else animal}'
        async with request('GET', image_url, headers={}) as response:
            if response.status == 200:
                data = await response.json()
                image_link = data['link']
            else:
                image_link = None

        async with request('GET', fact_url, headers={}) as response:
            if response.status == 200:
                data = await response.json()
                embed = Embed(title=f'{animal.title()} fact',
                              description=data['fact'],
                              colour=ctx.author.color)
                if image_link is not None:
                    embed.set_image(url=image_link)
                await ctx.send(embed=embed)
            else:
                await ctx.send(f'API returned a {response.status} status.') 

谢谢你的帮助,但我很抱歉地说,我认为你的答案不是我想要的。我有自己的解决方案。在看到您的答案几个小时后,我得出了一个结论,为什么不合并这两个语句,并使用另一个if语句,当输入“+fact birb”时,该语句将被触发发送额外的嵌入?这是按计划进行的,所以,我应该说是我自己想出来的?非常感谢你的帮助。希望像我这样的新程序员能得到像你这样善良的人的帮助。