13978074582 发表于 2022-11-7 20:41:13

不修改代码的情况下!如何访问这个嵌套函数


def fa():
        x = 520
        def fb():
                x = 880
                print('SSSS',x)
        print('aaaa',x)


不该代码的情况下如何访问 fa()内的fb()函数。。。。我试过 fa()()......fa().fb().....呵呵求解...还是无解???

tommyyu 发表于 2022-11-7 20:41:14

本帖最后由 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 函数,但是你还得自己去实现运行字节码

zhangjinxuan 发表于 2022-11-7 21:34:14

如果真的不修改fa,那么我只能告诉你:此题无解

jackz007 发表于 2022-11-7 22:35:55

      无解,唯一有希望通过 fa() . fb() 这种方式访问,也需要 fa() 返回 fb 才行。

fcage 发表于 2022-11-7 23:58:26

你这只能修改代码加个return fb才可以访问fb,要是不修改就能访问,还要那些封装闭包干嘛呢

人造人 发表于 2022-11-8 13:01:22

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!
>>>

人造人 发表于 2022-11-8 13:08:04

>>> 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
>>>

tommyyu 发表于 2022-11-15 16:52:37

我今天忽然发现用 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

13978074582 发表于 2022-11-16 11:38:40

tommyyu 发表于 2022-11-15 16:52
我今天忽然发现用 eval 函数好像也可以执行这个 b 函数

人才了。。距离BUG大神又近一步{:5_109:}
页: [1]
查看完整版本: 不修改代码的情况下!如何访问这个嵌套函数