我有一个包含内容的文件
a
我想解析此文件以检索
的信息b
和test
,
global_vars = {}
local_vars = {}
namespace = {}
with open(args.infile) as f:
code = compile(f.read(), args.infile, 'exec')
exec(code, global_vars, local_vars)
的函数
(我想使用此信息创建另一个文件。)
怎么做?
我可以使用
使用Python 3解析它testfunction = local_vars['test']
之后我得到了
test
我可以从testfunction
对象中找到有关testfunction.func_code.co_varnames
testfunction.func_code.co_code
的一些内容,例如变量名称和字节代码
message.header.allExtraHeadersNames; => ()
message.header.userAgent; => "(null)"
[message.header extraHeaderValueForName:@"X-Mailer"] => "(null)
但是,我不知道从哪里开始。
答案 0 :(得分:4)
假设您的文件名为x.py
。
您可以import
它,并使用dir()
查看其中的内容:
>>> import x
>>> dir(x)
['__builtins__', '__cached__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__spec__',
'a', 'b', 'test']
摆脱下划线垃圾:
>>> [obj for obj in dir(x) if not obj.startswith('__')]
['a', 'b', 'test']
非常普通的东西:
>>> x.a
24
>>> x.b
1.2
类型检查:
>>> type(x.a)
<class 'int'>
>>> type(x.b)
<class 'float'>
>>> type(x.test)
<class 'function'>
或者,因为你知道这些变量的名称(str):
>>> type(getattr(x, 'a'))
<class 'int'>
>>> type(getattr(x, 'b'))
<class 'float'>
>>> type(getattr(x, 'test'))
<class 'function'>
检查功能:
>>> import inspect
>>> s=inspect.signature(x.test)
>>> s.parameters
mappingproxy(OrderedDict([('x', <Parameter at 0x1080d09d8 'x'>), ('y', <Parameter at 0x1080db5a0 'y'>)]))
>>> list(s.parameters.keys())
['x', 'y']
>>> s.parameters['x'].kind
<_ParameterKind: 'POSITIONAL_OR_KEYWORD'>
>>> s.parameters['x'].default
<class 'inspect._empty'>
有关详细信息,请查看有关Python的inspect
模块的文档。
编译字节码唯一不能做的就是分析函数体(代码)。
如果您需要,可能需要解析文件,而不是解释它。看看Python的 parser
ast
模块。
另一方面,如果您对变量的值感兴趣,生成它们的值的代码可能是任意复杂的(例如:a, b = ((lambda x: x*(x-2))(6), 0.1*12)
),因此更容易解释代码,然后读取变量的值。