python - Python:获取方法使用的属性列表
问题描述
我想要一个(Python 3.7+)函数,给定一个(类,方法)对,它会给我一个执行方法计算所需的属性列表。
我知道一般情况可能很难(甚至不可能)解决,所以我会做一些涵盖大多数情况的事情(如果可以检测到无法安全处理的情况,我会很高兴(并且用户警告过它))。
考虑以下:
def func(obj):
return obj.a + obj.b
class A:
e = 2
def __init__(self, a=0, b=0, c=1, d=10):
self.a = a
self.b = b
self.c = c
self.d = d
def target_method(self, x=3):
t = func(self)
tt = self.other_method(t)
return x * tt / self.e
def other_method(self, x=1):
return self.c * x
我想要的attr_used_by_method
功能将执行以下操作:
>>> attr_used_by_method(cls=A, method_name='target_method')
['a', 'b', 'c', 'e']
因为: a
andb
用于对象传递给func
,c
被other_method
方法使用,并self.e
用于计算返回值。但该属性d
对计算机不是必需的,target_method
因此不返回。
我搜索了各种包inspect
,trace
看看他们是否可以完成工作,但看起来只有ast
能够正确完成工作。
ast
那里有书呆子吗?
对于上下文:我想要这样一个函数的原因是能够创建一个“专门的 json 序列化”,它只会序列化执行对象的特定方法所需的那些属性。
解决方案
该ast
模块可以做到。如果我们假设源存储在一个名为source
(可以从文件中读取)的变量中:
import ast
root = ast.parse(source)
names = sorted({node.id for node in ast.walk(root) if isinstance(node, ast.Name)})
这会失去排序以获得唯一性和友好的显示顺序,但如果您不需要唯一性但想要排序,则可以只使用列表推导或生成器表达式而不是集合推导。结果list
是:
['a', 'b', 'c', 'do_something', 'f', 'myList', 'range', 'someMethod', 'something', 'x']
推荐阅读
- ember.js - 是否可以将查询存储在变量中?
- html - 如何修复背景图像顶部的重复内容?
- oracle - 创建 pl/sql 过程的困难
- python - 为什么我不能在 Python 中打印 Tensor 对象的内容?
- angular - Amchart 图例 值和标记之间的边距不起作用
- .net - Azure AD Identity.Client 调用 AcquireTokenByUsernamePassword,得到 406 错误
- python - 试图绘制数据框中缺失的百分比
- r - Rmarkdown - 编织时如何查看警告
- node.js - 刮取数字的字符串
- android - 更新 firebase 构建版本后无法运行应用程序