小儿无赖 发表于 2023-8-27 13:12:47

求助代码问题

这个代码哪里错了?
# 题目要求:
# 请在此处补充装饰器 type_check() 的代码
def type_check(func):
    if func == int:
      if type(x) == "int":
            print(double(x))
      elif:
            print("参数类型错误!")
    elif func == str:
      if type(x) == "str":
            print(upper(x))
      elif:
            print("参数类型错误!")

print("<<<--- 测试整数 --->>>")

@type_check(int)
def double(x):
    return x * 2

print(double(2))      # 这里打印结果应该是 4
print(double("2"))    # 这里打印结果应该是 “参数类型错误”


print("\n<<<--- 测试字符串 --->>>")

@type_check(str)
def upper(s):
    return s.upper()

print(upper('I love FishC.'))   # 这里打印结果应该是 I LOVE FISHC
print(upper(250))               # 这里打印结果应该是 “参数类型错误”

陶远航 发表于 2023-8-27 13:13:02

代码中存在一些错误和问题,下面是我对代码进行修改的建议:

1. 在 type_check 函数中,判断 func 是否为 int 或 str 时,应该使用 is 运算符而不是比较运算符 ==,同时在判断类型时应该使用 type() 函数,而不是直接与字符串比较。

2. elif 语句缺少条件表达式。

3. 在 type_check 函数中,应该将传入的参数 x 作为函数的参数进行处理,而不能直接引用。

4. 装饰器应该在函数定义之前使用 @ 符号进行装饰,而不是在调用函数时进行。

下面是修改后的代码:

def type_check(func):
    def decorator(x):
      if func is int:
            if type(x) is int:
                print(double(x))
            else:
                print("参数类型错误!")
      elif func is str:
            if type(x) is str:
                print(upper(x))
            else:
                print("参数类型错误!")
    return decorator

@type_check(int)
def double(x):
    return x * 2

@type_check(str)
def upper(s):
    return s.upper()

print("<<<--- 测试整数 --->>>")
double(2)      # 这里打印结果应该是 4
double("2")    # 这里打印结果应该是 “参数类型错误”

print("\n<<<--- 测试字符串 --->>>")
upper('I love FishC.')   # 这里打印结果应该是 I LOVE FISHC
upper(250)            # 这里打印结果应该是 “参数类型错误”


请注意,以上修改仅是根据你提供的代码进行推测,可能还需要根据实际需求进一步调整。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-27 13:15:35

问题出在装饰器函数type_check()的代码实现上。以下是正确的代码实现:

def type_check(func):
    def wrapper(x):
      if isinstance(x, func):
            return func(x)
      else:
            print("参数类型错误!")
    return wrapper

print("<<<--- 测试整数 --->>>")

@type_check(int)
def double(x):
    return x * 2

print(double(2))       # 这里打印结果应该是 4
print(double("2"))   # 这里打印结果应该是 “参数类型错误”


print("\n<<<--- 测试字符串 --->>>")

@type_check(str)
def upper(s):
    return s.upper()

print(upper('I love FishC.'))   # 这里打印结果应该是 I LOVE FISHC
print(upper(250))               # 这里打印结果应该是 “参数类型错误”


解释:
· 在type_check()装饰器函数内部,我们定义了一个新的函数wrapper,它接受一个参数x。
· 在wrapper函数内部,我们首先使用isinstance()函数判断x的类型是否与传入的func类型相符。如果相符,则调用func(x)并返回结果。
· 如果x的类型与func类型不符,则打印"参数类型错误!"。
· 最后,将wrapper函数作为装饰器函数的返回值,用于包装原始函数。

这样,当我们使用@type_check装饰器来修饰double()和upper()函数时,会先进行参数类型检查,如果类型符合要求,则执行原始函数,否则打印错误信息。
页: [1]
查看完整版本: 求助代码问题