从 Python 3 中的代码对象中提取所有常量

我想提取函数中使用的所有常量。在Python 2.7中,我可以遍历函数的co_constsin__code__并提取所有字符串。例如, Python 2.7


>>> def func():

...:     return 'foo' if True else ('bar',)


>>> print(func.__code__.co_consts)

(None, 'foo', 'bar', ('bar',)) # no need to look into the tuple as 'bar' is available outside it as well.

这会给我'foo'和'bar'预期的那样。但是,在 中Python 3.7,代码对象'bar'只包含在元组内部。


蟒蛇 3.7


>>> print(func.__code__.co_consts)

(None, True, 'foo', ('bar',))

这意味着我还需要查看 co_consts 中的元组。我的困惑是内部是否可以有更多级别的嵌套co_consts?


肥皂起泡泡
浏览 247回答 2
2回答

哈士奇WWW

然后,您可以递归地遍历co_consts元组:def x():    return {        "y": ("bla" + "ble", ("blo", ["blu", "blip"])),        ("x", "z"): "blup",        True: False,        42: "hello" * 10,        None: 4 + 1j,    }def get_consts(func):    def walk(cell):        if isinstance(cell, tuple):            for item in cell:                yield from walk(item)        else:            yield cell    yield from walk(func.__code__.co_consts)for const in get_consts(x):    print(const)印刷NoneblablebloblublipblupFalsehellohellohellohellohellohellohellohellohellohello(4+1j)yxzTrue42None常量的顺序可能与原始源中的不同;它们确实对应于反汇编中的顺序:  5           0 LOAD_CONST               1 ('blable')              2 LOAD_CONST               2 ('blo')              4 LOAD_CONST               3 ('blu')              6 LOAD_CONST               4 ('blip')              8 BUILD_LIST               2             10 BUILD_TUPLE              2             12 BUILD_TUPLE              2  6          14 LOAD_CONST               5 ('blup')  7          16 LOAD_CONST               6 (False)  8          18 LOAD_CONST               7 ('hellohellohellohellohellohellohellohellohellohello')  9          20 LOAD_CONST               8 ((4+1j))             22 LOAD_CONST               9 (('y', ('x', 'z'), True, 42, None))             24 BUILD_CONST_KEY_MAP      5             26 RETURN_VALUE编辑:如果您需要源中的原始字符串,则需要使用该ast模块:import astimport inspectclass ConstantGatherer(ast.NodeVisitor):    def __init__(self):        super().__init__()        self.consts = []    def visit_Str(self, node):        self.consts.append(node.s)    def visit_Num(self, node):        self.consts.append(node.n)cg = ConstantGatherer()cg.visit(ast.parse(inspect.getsource(x)))print(cg.consts)输出['y', 'x', 'z', 42, 'bla', 'ble', 'blo', 'blu', 'blip', 'blup', 'hello', 10, 4, 1j]

呼啦一阵风

如何使用以下代码中3的函数从函数中获取 const 参数值?finspectdef l2_norm(x, axis):  print("l2_norm", x, axis)f = lambda x: l2_norm(x, axis=3)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python