解析Python文件以检索变量,值,函数定义

时间:2015-06-23 21:33:04

标签: python parsing

我有一个包含内容的文件

a

我想解析此文件以检索

的信息
  • 它包含两个变量btest
    • 他们的价值观,
  • 它包含一个名为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)

但是,我不知道从哪里开始。

1 个答案:

答案 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)),因此更容易解释代码,然后读取变量的值。