gpt4 book ai didi

python - 在 python 中测试副作用

转载 作者:行者123 更新时间:2023-11-30 23:42:13 25 4
gpt4 key购买 nike

我想检查我的函数没有副作用,或者只有影响精确变量的副作用。是否有一个函数可以检查它实际上没有副作用(或仅对某些变量有副作用)?

如果没有,我该如何编写自己的内容,如下所示:

我的想法是这样的,初始化,调用被测试的函数,然后调用 final方法:

class test_side_effects(parents_scope, exclude_variables=[]):
def __init__():
for variable_name, variable_initial in parents_scope.items():
if variable_name not in exclude_variables:
setattr(self, "test_"+variable_name, variable_initial)
def final(self, final_parents_scope):
for variable_name, variable_final in final_parents_scope.items():
if variable_name[:5] is "test_" and variable_name not in exclude_variables:
assert getattr(self, "test_"+variable_name) is variable_final, "Unexpected side effect of %s from %s to %s" % (variable_name, variable_initial, variable_final)

#here parents_scope should be inputted as dict(globals(),**locals())

我不确定这是否正是 the dictionary我想要...

最后,我应该这样做吗?如果没有,为什么不呢?

最佳答案

我不熟悉您可能用来编写测试的嵌套函数测试库,但似乎您确实应该在这里使用类(即许多框架中的 TestCase)。

如果您的问题与在测试用例中获取父变量有关,您可以得到 __dict__ (我不清楚您所指的“父”变量是什么。

更新:@hayden 发布了一个要点来显示父变量的使用:

def f():
a = 2
b = 1
def g():
#a = 3
b = 2
c = 1
print dict(globals(), **locals()) #prints a=1, but we want a=2 (from f)
g()
a = 1
f()

如果将其转换为字典,则问题可以通过以下方式解决:

class f(object): # could be unittest TestCase
def setUp(self, a=2, b=1):
self.a = a
self.b = b

def g(self):
#a = 3
b = 2
c = 1
full_scope = globals().copy()
full_scope.update(self.__dict__)
full_scope.update(locals())
full_scope.pop('full_scope')
print full_scope # print a = 1

my_test = f()
my_test.setUp(a=1)
my_test.g()

您寻找已经实现此功能的工具是正确的。我希望其他人能够有一个已经实现的解决方案。

关于python - 在 python 中测试副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559401/

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