gpt4 book ai didi

python - 带逗号的奇怪语法

转载 作者:行者123 更新时间:2023-12-01 01:03:07 25 4
gpt4 key购买 nike

我正在学习Python。我刚刚完成了装饰器的教程。我在一些代码中发现了一个装饰器,但看到了更多奇怪和不熟悉的东西。

def state(allowed=['*']):

def decorator(func):
func.__fsm_state__ = True
func.__fsm_allowed__ = allowed
return func

if callable(allowed):
func, allowed = allowed, ['*']
return decorator(func)

return decorator

我不知道下面一行的作用:

func, allowed = allowed, ['*']

谁能解释一下吗?

最佳答案

在这种情况下,状态不是直接的装饰器,而是一个元装饰器,或者一个装饰器生成函数:它不直接应用于函数,而是应用于其他一些函数参数,它将用来返回一个“真正的”装饰器:

def a(myargs): # applied to some arguments
def b(func): # decorator
do_smth(func, myargs)
return b # calling a will return the decorator

@a("world")
def hello(): # do_smth(hello, "world") is called
pass

当你输入时

@state(["something"])
def foo():
pass

这将使用 ["something"] 作为参数调用状态函数,该函数又将返回装饰器函数,该函数最终应用于函数 foo,设置 __fsm_state____fsm_allowed__ 属性,取决于最初传递给@state 的参数。

当您使用时

@state()
def foo():
pass

allowed(以及 __fsm_allowed__)将设置为默认值 ["*"],您可以在状态声明中看到该值功能。

如果你错过了括号,那就是,

@state  # <- no () there
def foo():
pass

函数 foo 被视为 state 的参数(因此 allowed 现在是 foo 而不是它实际上应该是的列表),这可能会导致微妙的错误 - 这就是为什么在状态的定义,有检查

if callable(allowed):

它捕获了直接传递 foo 的错误,并且只是假设您的意思是默认参数 (allowed=["*"])

以下代码,

func, allowed = allowed, ['*'] 
return decorator(func)

可以稍微简化为

func = allowed
allowed = ["*"]
return decorator(func)
  1. 将函数保存到 func
  2. 将参数设置为默认值并且
  3. 将“真实”装饰器应用于函数,

这实际上意味着 @state 和 @state() 现在执行完全相同的操作。

在我看来,检查应该是一个断言,这样您就可以快速找到并修复代码中的此类不一致之处,但无论是谁编写的,都决定默默地忽略它们。

关于python - 带逗号的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com