Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个decorator中的包装函数会自动运行而不调用它们?_Python_Python 3.x_Function_Python Decorators_Syntactic Sugar - Fatal编程技术网

Python 为什么这个decorator中的包装函数会自动运行而不调用它们?

Python 为什么这个decorator中的包装函数会自动运行而不调用它们?,python,python-3.x,function,python-decorators,syntactic-sugar,Python,Python 3.x,Function,Python Decorators,Syntactic Sugar,我正在探索如何在Python3中使用decorator。我在编辑器中键入这些代码,然后单击“运行”按钮 log_stat = False def decorator(): def wrapper(func): global log_stat while not log_stat: username = input("username") password = input("password")

我正在探索如何在Python3中使用decorator。我在编辑器中键入这些代码,然后单击“运行”按钮

log_stat = False


def decorator():
    def wrapper(func):
        global log_stat
        while not log_stat:
            username = input("username")
            password = input("password")
            if username == "123" and password == "456":
                func()
                log_stat = True
            else:
                print("try again")
    return wrapper


@decorator()
def welcome():                 
    print("welcome")
我不希望在屏幕上显示任何内容,因为我认为我所做的只是定义函数,而不是调用或执行它们。但是python让我输入用户名和密码,看起来它实际上运行了包装函数


真正的原因是什么?我如何定义函数而不触发包装函数呢?

因为您在使用它时调用了decorator。这意味着它在导入时运行。你应该去掉括号

@decorator
def welcome():                 
    print("welcome")

(可以定义一个在导入时调用的decorator,即它接受参数;但要做到这一点,您必须实现另一个级别的包装,以便函数返回一个decorator,而这个decorator又返回一个包装原始文件的函数。)

因为您在使用decorator时调用了它。这意味着它在导入时运行。你应该去掉括号

@decorator
def welcome():                 
    print("welcome")

(可以定义在导入时调用的decorator,即它接受参数;但要做到这一点,必须实现另一个级别的包装,以便函数返回decorator,而decorator又返回包装原始参数的函数。)

装饰器是一种可调用函数,它接受一个类或函数并返回一个类或函数。decorator语法是

@decorator  # note no ()
def function():
    ...
您要做的是调用
装饰器
,然后使用该调用的结果(
包装器
)装饰
欢迎
<因此,代码>包装器会立即运行

你打算写的可能是

def decorator(func):
    def wrapper(*args, **kwargs):
        global log_stat
        while not log_stat:
            username = input("username")
            password = input("password")
            if username == "123" and password == "456":
                log_stat = True
                return func(*args, **kwargs)           
            else:
                print("try again")  # I would raise an exception here
    return wrapper


@decorator
def welcome():                 
    print("welcome")

请注意,
wrapper
在此版本中接受参数。这是因为当你装饰
welcome
时,它会被
包装器所取代。因此,如果您的
welcome
函数接受了参数,那么您的
包装器也必须接受这些参数才能将它们传递给原始函数。

装饰器是一种可调用函数,它接受类或函数并返回类或函数。decorator语法是

@decorator  # note no ()
def function():
    ...
您要做的是调用
装饰器
,然后使用该调用的结果(
包装器
)装饰
欢迎
<因此,代码>包装器
会立即运行

你打算写的可能是

def decorator(func):
    def wrapper(*args, **kwargs):
        global log_stat
        while not log_stat:
            username = input("username")
            password = input("password")
            if username == "123" and password == "456":
                log_stat = True
                return func(*args, **kwargs)           
            else:
                print("try again")  # I would raise an exception here
    return wrapper


@decorator
def welcome():                 
    print("welcome")

请注意,
wrapper
在此版本中接受参数。这是因为当你装饰
welcome
时,它会被
包装器所取代。因此,如果您的
welcome
函数接受了参数,那么您的
包装器也必须接受这些参数才能将它们传递给原始函数。

我们在这里讨论的是哪个编辑器?很抱歉没有提及。我正在使用PyCharm的编辑器。我们在这里谈论的是哪个编辑器?很抱歉没有提及。我正在使用PyCharm的编辑器。很抱歉我之前的评论失败,我不知道如何在评论中正确插入代码。非常感谢你!!!我已经重写了我的代码,我在
welcome
中添加了一些参数,并将它们打印出来,结果成功了!因此,在本例中,
包装器
实际上并不使用参数,它只存储这些参数供
func
使用?这是否正确?@yjyj它可以使用参数,但在这种情况下它不能使用。很抱歉我之前的注释失败,我不知道如何在注释中正确插入代码。非常感谢你!!!我已经重写了我的代码,我在
welcome
中添加了一些参数,并将它们打印出来,结果成功了!因此,在本例中,
包装器
实际上并不使用参数,它只存储这些参数供
func
使用?这是正确的吗?@yjyj它可以使用参数,但在这种情况下就不行了。非常感谢!!!我添加了另一个外部装饰器,为它提供了参数,以便在导入和测试时调用它。成功了!所以在导入之后,最外层的装饰器被最外层的装饰器返回的内部装饰器替换,当我调用包装函数时,真正发生的是调用内部装饰器(外部装饰器的名称)?这是正确的吗?非常感谢!!!我添加了另一个外部装饰器,为它提供了参数,以便在导入和测试时调用它。成功了!所以在导入之后,最外层的装饰器被最外层的装饰器返回的内部装饰器替换,当我调用包装函数时,真正发生的是调用内部装饰器(外部装饰器的名称)?这是正确的吗?