gpt4 book ai didi

python - 解析 Python 文件以检索变量、值、函数定义

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:25 25 4
gpt4 key购买 nike

我有一个包含内容的文件

a = 24
b = 1.2

def test(x, y):
return x + y

我想解析这个文件来检索信息

  • 它包含两个变量ab
    • 他们的值(value)观,
  • 它包含一个名为test 的函数
    • 有两个输入参数和
    • 返回它们的总和。

(我想使用此信息创建另一个文件。)

怎么做?


我尝试过的

我可以使用 Python 3 解析它

global_vars = {}
local_vars = {}
namespace = {}
with open(args.infile) as f:
code = compile(f.read(), args.infile, 'exec')
exec(code, global_vars, local_vars)

之后我得到

testfunction = local_vars['test']

我可以从 testfunction 对象中找到一些关于 test 的东西,例如变量的名称和字节码通过

testfunction.func_code.co_varnames
testfunction.func_code.co_code

但是,我不知道从这里去哪里。

最佳答案

假设您的文件名为 x.py

您可以导入它,并使用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)), 因此更容易解释代码然后读取变量的值。

关于python - 解析 Python 文件以检索变量、值、函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com