python使用代码修改函数内部的变量名
def test(): a = 100
print(a)
装饰器可以给函数增加功能,那如果需要使用代码把函数内的a=100变成b=99,然后print(b),有办法可以实现吗?
回答:
当然可以。
为了更好的查看效果,原函数改成
def example(): a = 100
print(locals())
查看函数的 Bytecode 实现,用 dis.dis(example)
,输出
行 | 指令位置 | 指令 | 参数索引 | 参数值 |
---|---|---|---|---|
34 | 0 | LOAD_CONST | 1 | 100 |
2 | STORE_FAST | 0 | a | |
35 | 4 | LOAD_GLOBAL | 0 | |
6 | LOAD_GLOBAL | 1 | locals | |
8 | CALL_FUNCTION | 0 | ||
10 | CALL_FUNCTION | 1 | ||
12 | POP_TOP | |||
14 | LOAD_CONST | 0 | None | |
16 | RETURN_VALUE |
只需要修改
- co_consts[1] 为 99
- co_varnames[0] 为 'b'
代码如下
import disimport types
def modify(f):
c = f.__code__
consts = list(c.co_consts)
consts[1] = 99
varnames = list(c.co_varnames)
varnames[0] = 'b'
f.__code__ = types.CodeType(
c.co_argcount,
c.co_kwonlyargcount,
c.co_nlocals,
c.co_stacksize,
c.co_flags,
c.co_code,
tuple(consts),
c.co_names,
tuple(varnames),
c.co_filename,
c.co_name,
c.co_firstlineno,
c.co_lnotab,
c.co_freevars,
c.co_cellvars,
)
return f
def example():
a = 100
print(locals())
@modify
def example2():
a = 100
print(locals())
example()
# dis.dis(example)
example2()
# dis.dis(example2)
回答:
装饰器的本质是装饰,扩展,添加之意,并不变更原有的代码逻辑
以上是 python使用代码修改函数内部的变量名 的全部内容, 来源链接: utcz.com/a/160387.html