鱼C论坛

 找回密码
 立即注册
查看: 3277|回复: 8

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

[复制链接]
发表于 2022-11-7 20:41:13 | 显示全部楼层 |阅读模式
10鱼币
def fa():
        x = 520
        def fb():
                x = 880
                print('SSSS',x)
        print('aaaa',x)

不该代码的情况下如何访问 fa()内的fb()函数。。。。我试过 fa()()......fa().fb().....呵呵求解...还是无解???
最佳答案
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[2].co_code
b'd\x01}\x00t\x00d\x02|\x00\x83\x02\x01\x00d\x00S\x00'
而字节码是函数的调用过程的一个表现,得到了字节码,理论上就可以运行 fb 函数,但是你还得自己去实现运行字节码

最佳答案

查看完整内容

理论上是可以的,但是特别特别麻烦 首先,我们定义一个函数然后,我们可以通过它__code__属性下面的co_consts属性访问到它所包含的常量。此时我们发现,fb 在这个元组的第三个,因此我们就可以访问到 fb 的字节码而字节码是函数的调用过程的一个表现,得到了字节码,理论上就可以运行 fb 函数,但是你还得自己去实现运行字节码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2].co_code
b'd\x01}\x00t\x00d\x02|\x00\x83\x02\x01\x00d\x00S\x00'
而字节码是函数的调用过程的一个表现,得到了字节码,理论上就可以运行 fb 函数,但是你还得自己去实现运行字节码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-7 21:34:14 | 显示全部楼层
如果真的不修改fa,那么我只能告诉你:此题无解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-7 22:35:55 | 显示全部楼层
        无解,唯一有希望通过 fa() . fb() 这种方式访问,也需要 fa() 返回 fb 才行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-7 23:58:26 | 显示全部楼层
你这只能修改代码加个return fb才可以访问fb,要是不修改就能访问,还要那些封装闭包干嘛呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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!
>>>

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2]
<code object fb at 0x7f31f682cb30, file "<stdin>", line 3>
>>> fa.__code__.co_consts[2]()
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[2])
SSSS 880
>>>

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2])
b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-16 11:38:40 | 显示全部楼层
tommyyu 发表于 2022-11-15 16:52
我今天忽然发现用 eval 函数好像也可以执行这个 b 函数

人才了。。距离BUG大神又近一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 09:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表