不修改代码的情况下!如何访问这个嵌套函数
def fa():
x = 520
def fb():
x = 880
print('SSSS',x)
print('aaaa',x)
不该代码的情况下如何访问 fa()内的fb()函数。。。。我试过 fa()()......fa().fb().....呵呵求解...还是无解??? 本帖最后由 tommyyu 于 2022-11-8 08:52 编辑
理论上是可以的,但是特别特别麻烦
首先,我们定义一个函数>>> def fa():
x = 520
def fb():
x = 880
print('SSSS',x)
print('aaaa',x)然后,我们可以通过它__code__属性下面的co_consts属性访问到它所包含的常量。>>> fa.__code__.co_consts
(None, 520, <code object fb at 0x032ED1C0, file "<pyshell#5>", line 3>, 'fa.<locals>.fb', 'aaaa')此时我们发现,fb 在这个元组的第三个,因此我们就可以访问到 fb 的字节码>>> fa.__code__.co_consts.co_code
b'd\x01}\x00t\x00d\x02|\x00\x83\x02\x01\x00d\x00S\x00'而字节码是函数的调用过程的一个表现,得到了字节码,理论上就可以运行 fb 函数,但是你还得自己去实现运行字节码 如果真的不修改fa,那么我只能告诉你:此题无解 无解,唯一有希望通过 fa() . fb() 这种方式访问,也需要 fa() 返回 fb 才行。 你这只能修改代码加个return fb才可以访问fb,要是不修改就能访问,还要那些封装闭包干嘛呢 tommyyu 发表于 2022-11-7 20:41
理论上是可以的,但是特别特别麻烦
首先,我们定义一个函数然后,我们可以通过它__code__属性下面的co_con ...
我再补充一下
其实不用字节码
code这个库里面的InteractiveInterpreter对象
这个对象有一个runcode函数,用这个函数就可以
>>> def func():
... print('hello world!')
...
>>> func()
hello world!
>>> func.__code__
<code object func at 0x7f16a3ff75d0, file "<stdin>", line 1>
>>> func.__code__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'code' object is not callable
>>> import code
>>> code.InteractiveInterpreter().runcode(func.__code__)
hello world!
>>>
>>> def fa():
... x = 520
... def fb():
... x = 880
... print('SSSS',x)
... print('aaaa',x)
...
>>> fa.__code__.co_consts
(None, 520, <code object fb at 0x7f31f682cb30, file "<stdin>", line 3>, 'fa.<locals>.fb', 'aaaa')
>>> fa.__code__.co_consts
<code object fb at 0x7f31f682cb30, file "<stdin>", line 3>
>>> fa.__code__.co_consts()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'code' object is not callable
>>> import code
>>> code.InteractiveInterpreter().runcode(fa.__code__.co_consts)
SSSS 880
>>>
我今天忽然发现用 eval 函数好像也可以执行这个 b 函数def a():
print('a')
def b():
print('b')
a.__code__.co_consts
(None, 'a', <code object b at 0x0000020CC03A2970, file "<pyshell#4>", line 3>, 'a.<locals>.b')
eval(a.__code__.co_consts)
b
tommyyu 发表于 2022-11-15 16:52
我今天忽然发现用 eval 函数好像也可以执行这个 b 函数
人才了。。距离BUG大神又近一步{:5_109:}
页:
[1]