【问题标题】:Python decorator not behaving as expectedPython 装饰器的行为不符合预期
【发布时间】:2022-12-04 22:17:30
【问题描述】:

我在 YouTube 上关注 this tutorial 获得了这段代码。我无法理解为什么 div(10, 2) 会给出与 div(10, 0) 相同的输出,在这两种情况下都是 None。有人能告诉我它有什么问题吗?在除以 10/2 时如何使结果为 5?

def check(func):
    def inside(a, b):
      if b == 0:
        print ("Can't divide by 0")
        return 
      func(a, b)
    return inside
    

@check
def div(a, b):
  return a/b

print(div(10, 2))

【问题讨论】:

  • 你忘了做insidereturn func(a, b)

标签: python python-decorators


【解决方案1】:

在您发布的代码中, div 函数返回 a/b 的结果而不打印它。但是,检查装饰器中的内部函数不会返回此结果。相反,如果 b 为 0,它会打印一条消息并返回 None。这就是调用 div(10, 2) 和 div(10, 0) 都打印消息并返回 None 的原因。

为使代码按预期工作,您可以向返回调用 func(a, b) 的结果的内部函数添加 return 语句。当 b 不为 0 时,这将返回除法结果而不是 None。

下面是一个示例,说明如何修改代码来执行此操作:

def check(func):
    def inside(a, b):
        if b == 0:
            print("Can't divide by 0")
            return 
        return func(a, b)  # Return the result of the division
    return inside


@check
def div(a, b):
    return a/b

print(div(10, 2))

进行此更改后,调用 div(10, 2) 将返回除法结果,即 5。调用 div(10, 0) 将打印消息并像以前一样返回 None。

【讨论】:

    【解决方案2】:

    定义检查(功能): 内部定义(a,b): 如果 b == 0: print("不能除以0") 返回 函数(a,b) 返回内部

    @查看 def div(a, b): 返回 a / b

    打印(div(10, 0))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2022-01-06
      相关资源
      最近更新 更多