自省

2014-10-27 24 views
0

我經常發現在調試的時候自己做這樣的事情刪除冗餘Python中的「打印」:自省

print a.foo, b.bar, c.baz 

它打印像

1 3 4 

這是正確的,但不能作爲有用它可能是。
我非常要打印的是一樣的東西:

a.foo: 1, b.bar: 3, c.baz: 4 

這是很容易通過

print 'a.foo:', a.foo, 'b.bar:', b.bar, 'c.baz:', c.baz 

完成,但現在我正在寫同樣的事情兩次!

我可以使用某種類似內省的Python技巧來避免重複自己嗎?
我想象一個神奇的printexp這樣的:

printexp('a.foo', 'b.bar', 'c.baz') 

,但我不熟悉Python的自省能力,所以我不知道如何去這樣做。

回答

1

我想通了自己:

>>> def printexp(*exps, **kwargs): 
    import sys 
    import inspect 
    import itertools 
    locs = dict(inspect.currentframe().f_back.f_locals) 
    locs.setdefault('_file', kwargs['file'] if 'file' in kwargs else sys.stdout) 
    exec('print' + ' ' + '>>' + '_file' + ', ' + (', ' + '_file' + '.write(",")' + ' or ').join(map(lambda exp: '"' + exp.replace('"', '\\"') + ':' + '"' + ', ' + exp, exps)) + '', None, locs) 

>>> x = 5 
>>> printexp('x', 'x') 
x: 5, x: 5 
0

這不正是你要的,但如果你想用「普通」的對象(我指的是用戶定義的類的對象)來做到這一點,你可能只想這樣做:

print a.__dict__