按照变量声明的顺序检索局部变量()-python
比如说,按照变量声明的顺序检索局部变量()-python,python,locals,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 } {'a':1,'c':3,'b':2,''uuuu内置':,'uuuu包':None','uuuu名称':uuuu主'
a = 1
b = 2
c = 3
当调用locals()
时,我得到
{ 'a': 1, 'c': 3, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None }
{'a':1,'c':3,'b':2,''uuuu内置':,'uuuu包':None','uuuu名称':uuuu主','uuu文档':None}
如何按照我定义的顺序从locals()中检索局部变量?您可以通过访问代码对象在函数中执行此操作
\uuuu code\uuu
对象的.co\u 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中看起来会略有不同):
鉴于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)])
值得注意的是,这并没有回答如何使局部变量有序的问题。相反,此答案按顺序获取参数
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)])