首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写随参数变化的装饰器?

如何编写随参数变化的装饰器?
EN

Stack Overflow用户
提问于 2019-08-07 18:52:53
回答 4查看 83关注 0票数 -1

我必须编写一个以validator def作为参数的装饰器def。如果validator返回true,它应该修饰main以执行一些代码;如果它返回false,它应该打印一个错误。

我试图用if语句在装饰器中编写两个def,以返回两个不同的def,但它不起作用。

功能和逻辑必须完全像我所说的那样,因为在线判断(验证必须在装饰器之外完成)

下面是一个例子:

代码语言:javascript
复制
#define decorator...

def validator(x):
    return x>=0

@decorator(validator)
def f(x):
    return x**0.5

print(f(4)) #should print 2
print(f(-4)) #should print error
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-07 20:11:24

以下是您可以执行的操作

代码语言:javascript
复制
#define decorator...

def validator(x):
    return x>=0

def deco(validator):
    def decorator(func):
        def wrapper_decorator(*args, **kwargs):
            if validator(*args, **kwargs):
                return func(*args, **kwargs)
            else:
                print("error")
                return 
        return wrapper_decorator
    return decorator


@deco(validator)
def f(x):
    return x**0.5

print(f(4)) #should print 2
print(f(-4)) #should print error

每个人的答案基本上都是正确的。但是,对于您的情况,您需要一个额外的函数来充当验证器。因此,您可以添加另一个外部def来接收验证器的函数,并检查它是否返回True/False。

票数 1
EN

Stack Overflow用户

发布于 2019-08-07 19:06:22

装饰器可以编写为example

代码语言:javascript
复制
def hello_decorator(func): 
    def inner1(*args, **kwargs): 

        print("before Execution") 

        # getting the returned value 
        returned_value = func(*args, **kwargs) 
        print("after Execution") 

        # returning the value to the original frame 
        return returned_value 

    return inner1 


# adding decorator to the function 
@hello_decorator
def sum_two_numbers(a, b): 
    print("Inside the function") 
    return a + b 

a, b = 1, 2

# getting the value through return of the function 
print("Sum =", sum_two_numbers(a, b)) 

您可以将此代码重写为

代码语言:javascript
复制
def limit_decorator(func): 
    def internal(arg): 

        if (arg >= 0):
            return func(arg) 

        else:
            raise Exception("false input")

    return internal 


@limit_decorator
def square_root(a): 
    return a * 0.5

a = -5

print("Sum =", square_root(a)) 
票数 0
EN

Stack Overflow用户

发布于 2019-08-07 19:21:57

我建议对x进行验证,在嵌套函数上使用一层(基本上是将验证器函数合并到装饰器中)

代码语言:javascript
复制
def deco(f):
    def wrapper(x):
        if x<=0:
            return False
        else:
            return f(x)
    return wrapper


@deco
def f(x):
    return x**0.

f(1) #returns false
f(4) #returns 2.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57392755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档