Python中如何将多个变量合并为一个字典?

4
大家好,
A类:
class foo():
    def __init__(self):
        self.avar1 = 0
        self.bvar2 = 1
        self.cvar3 = 3
    def debug_info(self):
        print "avar1:" avar1
        print "bvar2:" bvar2
        print "cvar3:" cvar3

我的问题是,如果我有很多self.vars,那么写debug_info()函数会变得太复杂。因此,我希望将它们迁移到字典中,以便一次性打印,以进行调试和监视。但是,也许我不想失去格式。

foo.avar1 = 0

为了让代码易于阅读、使用和修改,我们建议在类内部访问变量。你们有没有比使用dict输出调试信息更好的想法呢?或者有人知道如何使这个类更简单吗?
谢谢!
5个回答

3
def debug_info ( self ):
    for ( key, value ) in self.__dict__.items():
        print( key, '=', value )

更加整洁和符合Python风格的做法是使用vars(self),在我看来。但是请注意下面关于使用slots的对象的评论,这种情况下需要使用dir(self)并从结果中进行选择。 - andybuckley

2
每个Python对象都已经有了这样一个字典,它是self.__dict__。这个打印出来就像其他Python字典一样,但是你可以使用Python标准库中的数据漂亮打印机(Data pretty printer)控制格式,或者循环遍历字典中的元素并按照你想要的方式打印它们,如下所示:
class foo():
    def __init__(self):
        self.avar1 = 0
        self.bvar2 = 1
        self.cvar3 = 3
    def debug_info(self):
        for k in self.__dict__:
            print k + ':' + str(self.__dict__[k])


>>> foo().debug_info()
bvar2:1
cvar3:3
avar1:0

@poke 感谢您注意到这个错误,那个输出是来自另一个版本的解决方案,只是打印了字典。 - Tendayi Mawushe

1

模块、类和实例都有__dict__,因此您可以在要显示调试的实例上引用它:

>>> f = foo()
>>> f.__dict__
{'bvar2': 1, 'cvar3': 3, 'avar1': 0}

1

虽然在大多数情况下使用__dict__是可行的,但并不总是有效 - 特别是对于具有__slots__变量的对象。

相反,尝试以下方法:

vars = [var for var in dir(obj) if not callable(getattr(obj, var)) and not var.startswith('__')]

1

关于打印的问题,其他人已经回答了。如果你在 __init__ 方法中需要设置大量变量,你也可以使用 __dict__ 来缩短代码。 如果你有很多变量,这样做至少可以避免你一直输入self。 我认为,在大多数情况下,标准方式更易读,但具体情况可能因人而异。

def __init__(self):
    vars = dict(avar1=0, bvar2=1, cvar3=3)
    self.__dict__.update(vars)

我不建议这样做;它会隐藏对象中可用的变量,并将所有信息压缩成一个小片段。此外,这对于问题并没有帮助,因为当对象变量更改其值时,vars不会得到更新。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接