在这个 Python 代码片段中:
def get_something():
return something
def do_staff():
value = get_something()
doit(value)
def test():
# ?????
doStaff()
get_something
根据 if 被调用来更改返回值的最佳方法是test or not
什么?唯一的限制是我不想修改do_staff
在这个 Python 代码片段中:
def get_something():
return something
def do_staff():
value = get_something()
doit(value)
def test():
# ?????
doStaff()
get_something
根据 if 被调用来更改返回值的最佳方法是test or not
什么?唯一的限制是我不想修改do_staff
您要么需要一个可选参数来更改函数的行为。这意味着您还需要一个可选参数 in do_staff
,因为这里真正的问题是如何判断从(或其他地方)get_something
调用的位置:do_staff
test
def get_something(test=False):
if test:
return something + test_var
return something
def do_staff(test=False):
value = get_something(test=test)
return doit(value)
def test():
return do_staff(test=True)
如果你真的,真的因为某种原因反对修改do_staff
,你将不得不查看堆栈以查看测试方法是否在上面,正如评论中提到的那样——但这很快就会变得丑陋。否则,判断函数如何被调用的唯一方法是传递一个指标。
不过,从上下文来看,我认为您真正想要的是知道如何测试这个东西,而不必在测试/生产环境之间修改太多代码。在这种情况下,我会建议一种完全不同的方法:与其尝试查看您是否是从某个地方被调用的,不如定义/导入一个is_debug_on
变量并使用它。
is_debug_on = False
def get_something():
if is_debug_on:
pass # Do testing stuff, print statements, etc.
return something # Do normal stuff.
def do_staff():
value = get_something()
def test():
is_debug_on = True
do_staff()
is_debug_on = False
显然,如果您可以将它们全部放在一个类中,或者使用logging
包等,这会更干净,但这是基本思想。您可以通过这种方式测试您的所有代码,而不必在进入生产环境时删除任何内容,因为调试模式将被关闭。奖励:当生产中出现问题时,您将能够重新打开调试并(希望)立即获得一些有用的信息!
可选参数?
def get_something(from_test=False):
if from_test:
return something_test
else:
return something
def test():
get_something(True)