gpt4 book ai didi

python - 使用 exec() 执行的代码中定义的函数范围

转载 作者:行者123 更新时间:2023-12-01 02:24:00 26 4
gpt4 key购买 nike

我有一个用 python 实现的简单测试台。

测试运行程序向测试公开一组函数。这可以被视为用于编写测试的领域特定语言。大多数测试用例形成对这些函数的简单调用序列,有时涉及控制流语句,但没有比这更复杂的了。

现在,一些测试用例变得过于复杂,使用函数重构会受益。这就是我遇到问题的地方。从函数内部,我无法访问测试用例内定义的本地符号。我也无法访问运行程序公开的功能(日志和验证)。

''' Testing variable scopes in exec()'''

PRG_1 = '''
a = 42
log('Testing a = ' + str(a))
verify(a, 42)
'''

PRG_2 = '''
a = 42
def f():
c = a # Error 'a' not defined
log(c) # Error 'log' not defined

f()
'''

class TestRunner():
def __init__(self, prg):
self.prg = prg

def log(self, msg):
print(msg)

def verify(self, a, b):
print('PASSED' if a == b else 'FAILED')

def run(self):
# Bring methods into local scope to avoid having 'self.' in DSL
log = self.log
verify = self.verify

# Execute test
exec(self.prg)

r = TestRunner(PRG_1)
r.run()

r = TestRunner(PRG_2)
r.run()

知道如何让它发挥作用吗?也许有一种不同的(更好的方法)来完成这个任务,但我作为一个 C++ 开发人员没有看到。

$ python3 test.py
Testing a = 42
PASSED
Traceback (most recent call last):
File "test.py", line 42, in <module>
r.run()
File "test.py", line 35, in run
exec(self.prg)
File "<string>", line 7, in <module>
File "<string>", line 4, in f
NameError: name 'a' is not defined

最佳答案

如果你这样做:

def run(self):
exec(self.prg, {'log': self.log, 'verify': self.verify})

产品:

42

无论如何,避免这样的动态代码执行通常是个好主意!

关于python - 使用 exec() 执行的代码中定义的函数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47592759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com