函数可以返回所传递内容的表示吗?

问题描述 投票:0回答:1

为了清晰起见,示例:

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.

它用于自定义文件调试器,我想知道它是否有可能。
如果没有,是否有办法将函数范围之外的变量传递给函数? (实际变量,不是它的值。

python python-3.x function scope
1个回答
0
投票

我假设您想要传递已定义且未隐藏的表达式。

如果是这样,您可以利用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)
© www.soinside.com 2019 - 2024. All rights reserved.