Python,能根据调用者改变函数行为吗?
在这段Python代码中:
def get_something():
return something
def do_staff():
value = get_something()
doit(value)
def test():
# ?????
doStaff()
有没有什么好的方法可以根据调用方式来改变get_something
返回的值?也就是说,如果是通过test
调用的,就返回一个值,如果不是,就返回另一个值。唯一的要求是我不想修改do_staff
这个函数。
2 个回答
1
可选参数是什么?
def get_something(from_test=False):
if from_test:
return something_test
else:
return something
def test():
get_something(True)
2
回答你问的问题
你可能想要一个可选的参数来改变函数的行为。这意味着你也需要在 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
包等等,那会更整洁,但这就是基本思路。你可以用这种方式测试你的所有代码,当你转到生产环境时不需要删除任何东西,因为调试模式会被关闭。额外好处:当生产环境出现问题时,你可以重新开启调试模式,并且(希望)能立刻获得一些有用的信息!