Python中的奇怪列表

eh57zj3b  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(111)

我尝试使用 discord.py 获取discord服务器的一个成员,使用guilide.members我在上面迭代,它返回成员的名字,但是我直接打印它,得到了如下的结果:

[<Member id=102833403109497170 name='Xiaoling' discriminator='147' bot=False nick=None guild=<Guild id=102393565654216714 name='DarkFuture' chunked=True member_count=22>>, <Member id=94117068084664839 name='Rishit' discriminator='0184' bot=False nick=None guild=<Guild id=1023935685654216714 name='DarkFuture' chunked=True member_count=22>>, <Member id=9417194317169792 name='麦わら帽子・Zoro' discriminator='905' bot=False nick=None guild=<Guild id=102393565654216714 name='DarkFuture' chunked=True member_count=22>>]

这是一个列表吗?我检查了它的类型,它说的是list,但是我看起来不像列表,如果我直接粘贴到代码编辑器中,有一个错误突出显示,如果我运行它,它给我一个语法错误,这是什么?Python是如何迭代它的?
我刚在Python中找到一个奇怪的列表,我不知道它是什么,我需要这些信息。

wlwcrazw

wlwcrazw1#

看一下类Member

class Member:
    def __init__(self,id,name,somethingElse=True):
        self.id = id
        self.name = name
        self.somethingElse = somethingElse

    def addExtraValue(self,extra):
        self.extra = extra
    
    def __repr__(self):
        return "<id = {}, name = '{}'>".format(self.id, self.name)

这里,Member类有自己的属性,如idname等。
让我们创建此类的列表

m1 = Member(1,'name 1')
m1.addExtraValue(15)
m2 = Member(2,'name 2', False)

members = [m1,m2]

当我们在这里打印members时,它将显示如下输出:

[<id = 1, name = 'name 1'>, <id = 2, name = 'name 2'>]

代替

[<__main__.Member object at 0x7fb9c093e4c0>, <__main__.Member object at 0x7fb9c07e8130>]

这是由于类中的def __repr__(self)函数,该函数用于创建自定义输出。
我希望这将澄清关于输出中<标记打印的混乱。
然后,类属性是不可迭代的,因此我们不能直接迭代它,或者不能作为列表访问属性(即不支持member[key])。
要解决此问题,可以使用eval方法,如下所示。

possibleKeys = ['id','name','somethingElse','extra']
for member in members:
    for key in possibleKeys:
        try:
            value = eval('member.{}'.format(key))
        except:
            value = 'Not Available'
        print("{} => {}".format(key,value))
    print()

eval被 Package 在try and catch中,因为extra属性不必在所有类对象中都可用。
我希望这将为迭代类对象以获取其他属性扫清道路。

相关问题