为了清晰起见,示例:
def foo(arg1):
<function goes here>
x = 5
foo(x > 4)
# foo() should return "x > 4" here.
# I do not want it to return the value, True.
它用于自定义文件调试器,我想知道它是否有可能。
如果没有,是否有办法将函数范围之外的变量传递给函数? (实际变量,不是它的值。)
我假设您想要传递已定义且未隐藏的表达式。
如果是这样,您可以利用inspect.stack来做到这一点:
from inspect import stack
def foo(arg1):
frame=stack()[1] ## go 1 frame back to when 'foo' was called
_,_,start,end=frame.positions._asdict().values() ## line positions e.g. lineno, end_lineno, col_offset, end_col_offset
## Warning: +4 and -1 are for removing 'foo(' and ')'; so if you rename the function bear this in mind
return frame.code_context[0][start+4:end-1]
x=1
foo(x > 33);foo(x>3)
foo(3)
## your example ##
x = 5
foo(x > 4)
注意: 这不适用于:
foo(
x > 4
)
由于code_context只会记录一行
此外,如果使用 CLI frame.code_context 可能不起作用,您可能需要将其切换为 readline.get_history_item 以检索执行的最后记录的代码行:
from inspect import stack
import readline
def foo(arg1):
frame=stack()[1]
_,_,start,end=frame.positions._asdict().values()
context=frame.code_context
line=context[0] if context else readline.get_history_item(0)
return line[start+4:end-1]
x = 5
foo(x > 4)