0

在这个 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

4

2 回答 2

2

回答您提出的问题

您要么需要一个可选参数来更改函数的行为。这意味着您需要一个可选参数 in do_staff,因为这里真正的问题是如何判断从(或其他地方)get_something调用的位置:do_stafftest

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包等,这会更干净,但这是基本思想。您可以通过这种方式测试您的所有代码,而不必在进入生产环境时删除任何内容,因为调试模式将被关闭。奖励:当生产中出现问题时,您将能够重新打开调试并(希望)立即获得一些有用的信息!

于 2013-03-12T16:07:46.080 回答
1

可选参数?

def get_something(from_test=False):
    if from_test:
        return something_test
    else:
        return something

def test():
    get_something(True)
于 2013-03-12T15:59:09.353 回答