按变量声明的顺序检索locals() - python

时间:2014-10-09 03:40:29

标签: python locals

例如,

a = 1

b = 2 

c = 3

致电locals()时,我会

{ 'a': 1, 'c': 3, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None }

如何按照我定义的顺序从locals()中检索局部变量?

2 个答案:

答案 0 :(得分:5)

您可以通过访问代码对象在函数中执行此操作。

__code__对象的.co_varnames属性按定义的顺序存储变量。这个扩展的例子具有指导意义,它显示了如何将参数传递给函数,以及内部定义的变量:

def foo(a, b, c=3, d=4, *args, **kwargs):
    e = 5
    f = 6
    g = 7
    for var in foo.__code__.co_varnames:
        print(var, locals()[var])

现在(由于print语句和函数之间的差异,在Python 2中会略有不同。):

>>> foo(1, 2, *(11, 12, 13), **{'h': 14, 'i': 15, 'j': 16})
a 1
b 2
c 11
d 12
args (13,)
kwargs {'i': 15, 'h': 14, 'j': 16}
e 5
f 6
g 7
var var

答案 1 :(得分:0)

鉴于locals()没有按顺序检索函数参数这一事实,我创建了一个实用程序函数用于调试目的。

import inspect
import logging
import traceback

def get_function_name():
    return traceback.extract_stack(None, 2)[0][2]

def get_function_parameters_and_values():
    frame = inspect.currentframe().f_back
    args, _, _, values = inspect.getargvalues(frame)
    return ([(i, values[i]) for i in args])

def my_func(a, b, c=None):
    logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')')
    pass

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)])