Python,能根据调用者改变函数行为吗?

0 投票
2 回答
2733 浏览
提问于 2025-04-17 18:49

在这段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 包等等,那会更整洁,但这就是基本思路。你可以用这种方式测试你的所有代码,当你转到生产环境时不需要删除任何东西,因为调试模式会被关闭。额外好处:当生产环境出现问题时,你可以重新开启调试模式,并且(希望)能立刻获得一些有用的信息!

撰写回答