在另一个函数中进行的函数调用的覆盖参数

时间:2019-06-17 21:55:59

标签: python python-3.x

说,我有两个功能bar()foo()bar()执行foo()

def foo():
    try:
        num = int( input("need an Integer") )
    except ValueError:
        print("input invalid")


def bar():
    foo()

当我运行bar()并键入非整数值时,我应该获得"input invalid"消息。但是,如果我想在"input invalid"中自定义此错误消息bar(),而无需修改foo()。 我该怎么办?

我尝试了以下操作,但这不起作用。

def foo():
    try:
        num = int( input("need an Integer") )
    except ValueError:
        print("input invalid")


def bar():
    try:
        foo()

    except Exception as result:  <-- this does not capture the error in foo()
        print("my customized error message")  


所需的输出是:"my customized error message"而不是"input invalid"(但如果我可以同时输出两条消息,则可以接受)

2 个答案:

答案 0 :(得分:3)

您可以使用unittest.mock.patch通过自定义函数临时覆盖内置print函数,该函数使用原始的print函数,如果传入的消息与要替换的消息,否则按原样打印消息:

from unittest.mock import patch

def custom_print(s, *args, **kwargs):
    orig_print("my customized error message" if s == "input invalid" else s, *args, **kwargs)

orig_print = print

def bar():
    with patch('builtins.print', new=custom_print):
        foo()

bar()

答案 1 :(得分:0)

您基本上处于良好状态。您要做的是raise中的一个foo异常,您可以在bar中捕获该异常。这是通过以下所示的raise命令完成的:

def foo():
    try:
        num = int( input("need an Integer") )
    except ValueError:
        raise Exception("input invalid")


def bar():
    try:
        foo()

    except Exception as e:
        print("my customized error message")  

如果现在执行bar()并引发异常,则可以在bar()中捕获它并打印另一条消息。如果要获取原始消息,可以通过打印str(e)来实现。