2010-10-20 68 views
4

所有,python serval变量组合成字典?

类:

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 

我的问题,实在是太复杂写DEBUG_INFO(),如果我得到了很多self.vars 的,那么我想他们迁移到快译通然而把它们打印一气呵成用于调试和监控的目的,也许我不想丢失格式

foo.avar1 = 0 

访问类内的增值经销商,因为它很容易阅读和易于使用的并修改。你有没有更好的主意,而不是去上课。 dict为debug_info输出?还是有人知道更好的方法让这个类更简单?

谢谢!

回答

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

有点整洁和更Pythonic是使用变量(自我),国际海事组织。但也可以看下面关于使用插槽的对象的注释,为此使用dir(self)并从结果中选择是必要的。 – andybuckley 2010-10-20 14:42:50

1

模块,类和实例都__dict__,所以你可以参考它的情况下,你想显示的调试:

>>> f = foo() 
>>> f.__dict__ 
{'bvar2': 1, 'cvar3': 3, 'avar1': 0} 
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 
+0

您的示例输出与您的代码不匹配。 – poke 2010-10-20 15:29:49

+0

@poke感谢您注意到错误,输出来自不同版本的解决方案,只是打印字典。 – 2010-10-20 15:44:12

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) 
+0

我不会建议这样做;它完全隐藏了对象中的哪些变量可用,并将所有信息压缩成小块。另外,这对问题没有帮助,因为当对象变量改变它的值时,'vars'不会被更新。 – poke 2010-10-20 15:32:05